我最近接受过两次电话采访,其中我被问及接口和抽象类之间的区别.我已经解释了他能想到的每一个方面,但似乎他们在等我提一些具体的东西,我不知道它是什么.
根据我的经验,我认为以下是正确的.如果我错过了重点,请告诉我.
接口:
在接口中声明的每个单独的方法都必须在子类中实现.接口中只能存在事件,代理,属性(C#)和方法.一个类可以实现多个接口.
抽象类:
只有抽象方法必须由子类实现.Abstract类可以有实现的常规方法.Abstract类还可以在Events,Delegates,Properties和Methods旁边有类变量.由于C#中不存在多重继承,因此类只能实现一个抽象类.
毕竟,面试官想出了一个问题"如果你有一个只有抽象方法的抽象类怎么办?那么它与界面会有什么不同?" 我不知道答案,但我认为这是上面提到的继承权吗?
另一位采访者问我,如果你在界面中有一个Public变量,那么它与Abstract Class有什么不同?我坚持认为你不能在界面中有一个公共变量.我不知道他想听到什么,但他也不满意.
另见:
以下是封装和抽象的简要定义.
抽象:
Java中的抽象过程用于隐藏某些细节,仅显示对象的基本特征.换句话说,它处理对象(界面)的外部视图.我在不同站点看到的唯一好例子是界面.
封装:
它基本上是在私有,公共,受保护等修饰符的帮助下隐藏对象的状态.我们只在需要时通过公共方法暴露状态.
我们用修饰符所实现的private,public也隐藏了来自外部世界的不必要的细节,这也是一个抽象概念
因此,从上面的解释来看,封装是抽象的一部分,或者我们可以说它是抽象的一个子集.但是,为什么封装术语是在我们只能用抽象来处理的时候发明的呢?我确信应该有一些区别于它们的主要区别,但网上的大多数材料对两者都说几乎相同.
虽然这个问题早已在这个论坛上提出过,但我再次发布它并带有特别的怀疑.一些回复还说抽象是一个概念,封装是实现.但我不买这个 - 如果是真的,那么我可以认为提供这两个不同的概念来迷惑我们.
更新: - 5年后我得出了自己的答案,这是基于这篇文章及以下答案的要点
学习OOP概念特别有兴趣深入了解抽象和封装.
已经查看了下面的内容
我发现用一个真实而简单的示例类/代码片段很难理解这些概念.
我的一位同事说抽象只不过是创建抽象类和普通类来保护其成员变量的范围称为封装.
是否有一种简单的方法可以理解并帮助其他人了解它们究竟是什么,而不是重复下面的内容?
抽象和封装是互补的概念:抽象侧重于对象的可观察行为......封装侧重于产生这种行为的实现......封装通常是通过信息隐藏来实现的,这是隐藏所有内容的过程.对象的秘密不会对其基本特征产生影响.
我今天接受了采访.我有一个来自OOP的问题,关于Encapsulation&Abstraction之间的区别?
我回答她的知识,Encapsulation基本上是将数据成员和成员函数绑定到一个名为Class的单元中.而抽象基本上是为了隐藏实现的复杂性并提供对用户的轻松访问.我觉得她的回答会很好.但她问道,如果两者的目的都是隐藏信息,那么这两者之间的实际区别是什么?我不能给她任何答案.
在提出这个问题之前,我在StackOverFlow上阅读了关于这两个OOP概念之间差异的其他线程.但我并没有发现自己有能力说服采访者.
任何人都可以用最简单的例子来证明它的合理性吗?
对于封装的示例,我可以想到用户和移动电话之间的交互.用户不需要知道移动电话的内部工作来操作,因此这称为抽象.但封装在哪里适合这个例子?有人可以对此有所了解吗?
我一直在进行有关OOP概念的研究,并且在试图理解什么是Abstraction方面存在一些问题。我已经阅读了许多关于该主题的Stack Overflow帖子,但实际上并不能确定令人满意的答案。
我已经看到了很多的讨论上的差异抽象和封装,自然开始约开始思考抽象躲藏方面特定类的作品,并提供通过抽象类的API如何。以下是一些引导我朝这个方向发展的帖子:
但是,当我阅读更多文章时,我注意到在继承上下文中描绘抽象的答案,特别是使用接口和抽象类来提供特定实体(类)的抽象。我假设以这种方式给出的抽象将允许开发人员根据此抽象概述的“准则”适当地扩展新对象。以下是一些引导我朝这个方向发展的帖子:
我不确定我是否会完全遗漏这里的要点,但是它变得非常令人困惑,因为每个答案似乎都给混音添加了些许变化。我绝对明白为什么这两种上下文在面向对象编程中都至关重要,但是我确实想要明确定义什么是抽象。
这使我明白:抽象是否可以在多个上下文中工作?不抽象描绘这两个概念?
隐藏通过接口和抽象类完成的“不必要的细节”
IPet该接口可以充当Dog类的抽象。另外,我们可以提供Animal基类作为抽象类,以提供更高级别的抽象。这可以让我们使用多态性,并允许属于我们Animal抽象的不同类彼此交互。通过类API公开类的实现以抽象其实现
Dog类,我们只需要知道它有一个feed() 函数作为其API的一部分,并调用该函数来对其进行馈送,而无需知道馈送的实际完成方式。这提供了Dog类的抽象,并让我们轻松地与类进行交互我上面包含的链接之一包含Matthew Watson的以下引用:
“问题在于这些概念没有精确的定义,并且单词本身甚至在面向对象的上下文中也具有多种含义。”
仅仅是抽象是如此抽象,甚至定义是抽象:P吗?感谢您提前提供任何指导!
编辑:我对SO相当陌生,并不真正了解“主要基于意见”标志的含义。我看不出这个问题比关于SO上的抽象的众多问题如何有效。我认为应该较少地基于观点,因为我实际上是在指出我认为抽象在其中有意义的两个不同上下文。我已经看到许多问题,只是问什么是抽象,我认为这是一个更广泛的问题。比我在这里的问题。
有些人将抽象定义为:
抽象通过在基本功能上提供一个层来隐藏实现细节.
它不是封装的一部分来隐藏对象用户的实现细节吗?
让我们说Animal类有函数eat(),那么为对象的用户提供这个接口是封装还是抽象?或提供使用的函数名称是抽象,方法实现部分的隐藏是封装.
我很困惑,因为在许多地方它是抽象的,很多人说实现细节隐藏是封装?
在这个SO问题的最佳答案:
抽象=对象外部; 封装(通过信息隐藏实现)=内部对象.
那么这意味着对象接口暴露是抽象而隐藏在对象内部的数据是封装吗?