我最近接受过两次电话采访,其中我被问及接口和抽象类之间的区别.我已经解释了他能想到的每一个方面,但似乎他们在等我提一些具体的东西,我不知道它是什么.
根据我的经验,我认为以下是正确的.如果我错过了重点,请告诉我.
接口:
在接口中声明的每个单独的方法都必须在子类中实现.接口中只能存在事件,代理,属性(C#)和方法.一个类可以实现多个接口.
抽象类:
只有抽象方法必须由子类实现.Abstract类可以有实现的常规方法.Abstract类还可以在Events,Delegates,Properties和Methods旁边有类变量.由于C#中不存在多重继承,因此类只能实现一个抽象类.
毕竟,面试官想出了一个问题"如果你有一个只有抽象方法的抽象类怎么办?那么它与界面会有什么不同?" 我不知道答案,但我认为这是上面提到的继承权吗?
另一位采访者问我,如果你在界面中有一个Public变量,那么它与Abstract Class有什么不同?我坚持认为你不能在界面中有一个公共变量.我不知道他想听到什么,但他也不满意.
另见:
我何时应该使用接口,何时应该使用基类?
如果我不想实际定义方法的基本实现,它应该始终是一个接口吗?
如果我有狗和猫类.为什么我要实现IPet而不是PetBase?我可以理解有ISheds或IBarks(IMakesNoise?)的接口,因为那些可以基于宠物放在宠物上,但我不明白哪个用于通用Pet.
在我的一次访谈中,我被要求解释Interface和Abstract类之间的区别.
这是我的回答:
Java接口的方法是隐式抽象的,不能有实现.Java抽象类可以具有实现默认行为的实例方法.
在Java接口中声明的变量默认为final.抽象类可能包含非最终变量.
默认情况下,Java接口的成员是公共的.Java抽象类可以具有类似私有,受保护等类通常的类成员.
应使用关键字"implements"实现Java接口; 应使用关键字"extends"扩展Java抽象类.
接口只能扩展另一个Java接口,抽象类可以扩展另一个Java类并实现多个Java接口.
Java类可以实现多个接口,但它只能扩展一个抽象类.
然而,面试官并不满意,并告诉我这个描述代表了" 书本知识 ".
他告诉我一个更实际的回答,解释我何时会使用实际例子在界面上选择一个抽象类.
我哪里做错了?
什么时候在对象中使用工厂方法而不是Factory类是个好主意?
我的公司即将雇用.NET开发人员.我们在各种.NET平台上工作:ASP.NET,Compact Framework,Windowsforms,Web Services.我想编制好的问题列表/目录,这是一种最低标准,以确定申请人是否有经验.所以,我的问题是:
您认为一个优秀的.NET程序员应该回答什么问题?
我也将它视为自己的清单,以便了解我自己的赤字在哪里(有很多......).

*更新:它想明确我们不仅仅测试.NET知识,解决问题的能力和一般编程技能对我们来说更为重要.
我一直在阅读有关OCP主要内容以及如何使用策略模式来实现这一目标.
我打算尝试向几个人解释这个,但我能想到的唯一例子是根据"订单"的状态使用不同的验证类.
我在线阅读了几篇文章,但这些文章通常没有描述使用该策略的真实原因,如生成报告/账单/验证等...
是否有任何现实世界的例子,您认为策略模式是常见的?
我想知道什么时候应该使用接口.
让我们考虑以下事项:
public abstract class Vehicle {
abstract float getSpeed();
}
Run Code Online (Sandbox Code Playgroud)
并且:
public interface IVehicle {
float getSpeed();
}
Run Code Online (Sandbox Code Playgroud)
我可以很容易地实现它们,它们具有相同的功能......但是我也可以在我的车辆类中添加一些变量,这些变量可能应该用在车辆中(maxSpeed,carType ......)
使用接口的原因是什么?
谢谢!
编辑:我在另一个帖子中找到了一个很好的链接:http://www.thecoldsun.com/en/content/01-2009/abstract-classes-and-interfaces
我正在研究我的设计模式,我在编码中尚未认真使用的一种模式是装饰模式.
我理解这种模式,但我想知道的是现实世界中一些具体的例子,装饰者模式是最佳/最佳/优雅的解决方案.需要装饰器模式的特定情况非常方便.
谢谢.
我最近参加了一次采访,他们问我"为什么接口比抽象类更受欢迎?"
我尝试给出一些答案,如:
他们让我带走你使用的任何JDBC api."为什么他们是接口?".
我可以为此得到更好的答案吗?
虽然某些指导原则指出,当你想为继承不是明确的类定义合同时应该使用接口(IDomesticated),当类是另一个(Cat : Mammal,Snake : Reptile)的扩展时继承,有些情况(在我看来)这些准则进入灰色地带.
例如,说我的实施是Cat : Pet.Pet是一个抽象类.应该说是扩大到Cat : Mammal, IDomesticated那里Mammal是一个抽象类,IDomesticated是接口?或者我是否与KISS/YAGNI原则相冲突(尽管我不确定Wolf将来是否会有一个课程,但是无法继承Pet)?
远离隐喻Cats和Pets,假设我有一些表示传入数据源的类.他们都需要以某种方式实现相同的基础.我可以在抽象Source类中实现一些通用代码并从中继承.我也可以创建一个ISource接口(对我来说感觉更"正确")并在每个类中重新实现通用代码(这不太直观).最后,通过制作抽象类和界面,我可以"吃蛋糕并吃掉它".什么是最好的?
这两种情况提出了仅使用抽象类,只使用接口并同时使用抽象类和接口的要点.这些都是有效的选择,还是存在"规则",以便何时应该使用另一个?
我想通过"同时使用抽象类和接口"来澄清,当它们基本上表示相同的事物(Source并且ISource两者都具有相同的成员)时,包括这种情况,但是类在接口指定合同时添加了通用功能.
另外值得注意的是,这个问题主要针对不支持多重继承的语言(例如.NET和Java).
interface ×6
oop ×6
java ×4
inheritance ×2
.net ×1
abstraction ×1
base-class ×1
c# ×1
decorator ×1
factory ×1