小编典典

抽象和封装有何不同?

c#

我正在准备面试,并决定重新整理我的OOP概念。有数百篇文章可用,但似乎每个文章对它们的描述都不相同。
有人

抽象是“识别具有系统变异的通用模式的过程;抽象表示通用模式,并提供了指定使用哪种变异的方法”(Richard Gabriel)。

并通过抽象类实现。

一些其他的

抽象意味着只向对象的客户显示必要的细节

假设您的Employee类中有一个方法“
CalculateSalary”,该方法将EmployeeId作为参数,并以整数值返回当月员工的薪水。现在,如果有人想使用该方法。他不需要关心Employee对象如何计算薪水?他唯一需要关注的是方法的名称,其输入参数和所得成员的格式,

我一遍又一遍地搜索,结果似乎都没有给我一个正确的答案。 现在,封装在所有这些方面适合什么地方?
我搜索发现堆栈溢出问题。它说,即使是这些问题的答案也使这里感到困惑。

封装是用作抽象的一部分的策略。封装是指对象的状态-
对象封装其状态并将其从外部隐藏起来;类的外部用户通过其方法与之交互,但无法直接访问类的状态。因此,该类抽象出了与状态相关的实现细节。

这里的另一个知名的成员说,

它们是不同的概念。

抽象是完善对象的所有不需要/不重要属性并仅保留最适合您的域的特征的过程。

现在我把整个概念弄糊涂了。我了解抽象类,继承,访问说明符以及所有其他内容。我只想知道 在面试中被问到抽象和/或封装时应该如何回答。

请不要将其标记为重复项
。我知道有几个类似的问题。但是,我想避免相互矛盾的解释之间的混淆。谁能建议一个可靠的链接?也欢迎使用stackoverflow问题的链接,除非它再次造成混乱。:)

编辑:我需要答案,有点面向C#


阅读 443

收藏
2020-05-19

共1个答案

小编典典

抽象意味着只向对象的客户显示必要的细节

其实就是封装。另请参阅Wikipedia文章的第一部分,以免被封装和数据隐藏所混淆。http://en.wikipedia.org/wiki/Encapsulation_(面向对象的编程)

请记住,仅将您所有的类成员1:1隐藏在属性后就根本不是封装。封装是关于保护不变量和隐藏实现细节的。

这是一篇很好的文章。
http://blog.ploeh.dk/2012/11/27/Encapsulationofproperties/
还可以查看该文章中链接的文章。

类,属性和访问修饰符是在c#中提供封装的工具。

您可以进行封装以降低复杂性。

抽象是“识别具有系统变异的通用模式的过程;抽象表示通用模式,并提供了指定使用哪种变异的方法”(Richard Gabriel)。

是的,这是抽象的一个很好的定义。

它们是不同的概念。抽象是完善对象的所有不需要/不重要属性并仅保留最适合您的域的特征的过程。

是的,它们是不同的概念。请记住,抽象实际上与使对象仅适合您的域相反。一般是为了使对象适合领域!

如果您遇到实际问题并提供特定的解决方案,则可以使用抽象来形式化更通用的解决方案,该解决方案也可以解决具有相同通用模式的更多问题。这样,您可以提高组件的可重用性,也可以使用由其他程序员为相同域甚至不同域制作的组件。

.net框架提供的类就是很好的例子,例如列表或集合。这些都是非常抽象的类,您几乎可以在任何地方和许多领域中使用。试想一下,如果.net仅实现了一个EmployeeList类和一个CompanyList,该类只能容纳具有特定属性的员工和公司列表。这样的类在很多情况下是没有用的。例如,如果您必须重新实现CarList的全部功能,那将是多么痛苦。因此,“列表”与员工,公司和汽车无关。List本身是一个抽象概念,可以由其自己的类实现。

接口,抽象类或继承和多态是在c#中提供抽象的工具。

您进行抽象以提供可重用性。

2020-05-19