我最近接受过两次电话采访,其中我被问及接口和抽象类之间的区别.我已经解释了他能想到的每一个方面,但似乎他们在等我提一些具体的东西,我不知道它是什么.
根据我的经验,我认为以下是正确的.如果我错过了重点,请告诉我.
接口:
在接口中声明的每个单独的方法都必须在子类中实现.接口中只能存在事件,代理,属性(C#)和方法.一个类可以实现多个接口.
抽象类:
只有抽象方法必须由子类实现.Abstract类可以有实现的常规方法.Abstract类还可以在Events,Delegates,Properties和Methods旁边有类变量.由于C#中不存在多重继承,因此类只能实现一个抽象类.
毕竟,面试官想出了一个问题"如果你有一个只有抽象方法的抽象类怎么办?那么它与界面会有什么不同?" 我不知道答案,但我认为这是上面提到的继承权吗?
另一位采访者问我,如果你在界面中有一个Public变量,那么它与Abstract Class有什么不同?我坚持认为你不能在界面中有一个公共变量.我不知道他想听到什么,但他也不满意.
另见:
我何时应该使用接口,何时应该使用基类?
如果我不想实际定义方法的基本实现,它应该始终是一个接口吗?
如果我有狗和猫类.为什么我要实现IPet而不是PetBase?我可以理解有ISheds或IBarks(IMakesNoise?)的接口,因为那些可以基于宠物放在宠物上,但我不明白哪个用于通用Pet.
我被问到一个问题,我想在这里查看我的答案.
问:在哪种情况下扩展抽象类而不是实现接口更合适?
答:如果我们使用模板方法设计模式.
我对么 ?
如果我无法清楚地陈述问题,我很抱歉.
我知道抽象类和接口之间的基本区别.
1)当需求需要在特定操作的每个子类中实现相同的功能(实现方法)和其他一些操作的不同功能(仅方法签名)时,使用抽象类
2)如果需要将签名设置为相同(并且实现不同),请使用接口,以便您可以遵守接口实现
3)我们可以扩展一个抽象类的最大值,但可以实现多个接口
重申一个问题:除了上面提到的那些之外,还有其他任何场景,具体我们需要使用抽象类(一个是模板方法设计模式在概念上仅基于此)吗?
接口与抽象类
在这两者之间做出选择真的取决于你想做什么,但幸运的是,对我们来说,Erich Gamma可以帮助我们一点.
一如既往地存在权衡,接口为您提供基类的自由,抽象类使您可以自由地在以后添加新方法. - Erich Gamma
你无法在不改变代码中的许多其他东西的情况下更改接口,因此避免这种情况的唯一方法是创建一个全新的接口,这可能并不总是一件好事.
Abstract classes应主要用于密切相关的对象.Interfaces更好地为不相关的类提供通用功能.
我有一些数字Processor类可以完成两个非常不同的事情,但是从公共代码调用("控制反转"情况).
我想知道在决定它们是否应该全部继承BaseProcessor或实现IProcessor为接口时,我应该认识(或认识到,对于你的USsers)的设计考虑因素.
重复:接口与基类
我已经深入了解OOP,设计模式和动作脚本3的世界,我仍然很好奇如何知道何时使用Abstract类(对于不支持Abstract类的AS3的伪)和接口.对我来说,两者都只是作为模板来确保在给定的类中实现某些方法.区别仅在于抽象类需要继承而接口只是扩展吗?
谢谢,Brian Hodge hodgedev.com