我最近接受过两次电话采访,其中我被问及接口和抽象类之间的区别.我已经解释了他能想到的每一个方面,但似乎他们在等我提一些具体的东西,我不知道它是什么.
根据我的经验,我认为以下是正确的.如果我错过了重点,请告诉我.
接口:
在接口中声明的每个单独的方法都必须在子类中实现.接口中只能存在事件,代理,属性(C#)和方法.一个类可以实现多个接口.
抽象类:
只有抽象方法必须由子类实现.Abstract类可以有实现的常规方法.Abstract类还可以在Events,Delegates,Properties和Methods旁边有类变量.由于C#中不存在多重继承,因此类只能实现一个抽象类.
毕竟,面试官想出了一个问题"如果你有一个只有抽象方法的抽象类怎么办?那么它与界面会有什么不同?" 我不知道答案,但我认为这是上面提到的继承权吗?
另一位采访者问我,如果你在界面中有一个Public变量,那么它与Abstract Class有什么不同?我坚持认为你不能在界面中有一个公共变量.我不知道他想听到什么,但他也不满意.
另见:
我的问题涉及如何在F#中以功能方式处理继承.为了稍微描述一下,我举一个简单的例子.假设我们想要建立一个由各种动物组成的世界.每种动物都与其他种类共享一些属性(例如名称,大小等).此外,每种类型都可能有其他的,其他人不共享(例如,儿童的数量与狗和猫相关,但不适用于蜘蛛).此外,可能存在与每种动物类型相关联的方法或功能,其对于两种动物类型可能相同或不同,即存在可能对于特定种类而言过度的默认实施方式.每种动物类型可以具有仅针对该类型定义的方法.
现在,在OOP世界中,这可能会导致抽象类具有公共属性和抽象方法,后面是为每种动物类派生的类.我不确定如何在F#中功能性地指定域模型.这里: 在F#中使用哪些,抽象类或接口?声称"惯用的F#代码使用与C#不同的可扩展点(例如将函数/接口作为参数),因此您不需要抽象类".
如果这是应该采用的方式,是否可以提供一些基本的例子呢?
至于我对此的进一步思考,我认为属性应该封装在某种结构中.那么,F#中这方面的大多数惯用结构都是记录.这是否意味着存在父记录,该记录应包括在对应于特定"子"的其他记录中,即组成而不是继承.然而,在我看来,这是一种既不惯用也不特别优雅的解决方法.
我认为如何在F#中建模继承的首选方法是有区别的联合.但是,这并不能解决共享属性和方法的问题.
在我看来,与上述类似的模型非常频繁,因为它们隐含在大多数企业应用程序中.因此,是否有任何建议如何以功能方式处理(例如上述链接建议的方式或任何其他建议)?或者我们是否应该说这不是一个可以使用功能方法轻松建模的域名?
谢谢.
所以你有一个接口和一个抽象类,它实现了接口中方法的一个子集.你还有一些继承抽象类的类,并给出了抽象类没有给出的方法的实现.
那么这里最好的做法是什么?我在谈论的问题如下:
1)抽象类应该实现接口还是它的子类?应该每节课吗?在我看来,只是抽象类应该.当然,所有类都可以实现接口,但这似乎是多余的,因为抽象的子节点将"继承"接口,因为它们扩展了抽象类.
2)鉴于抽象类实现了接口的一部分,它是否还应该为它没有实现的方法声明抽象方法?在我看来,这是正确的,但在某种程度上,这似乎是多余的,因为抽象的孩子需要实现这些方法才能编译.
那么你对最佳实践的论点是什么?问题归结为:我们有一个接口定义了我们想要某些类做什么,我们在接口中有一个定义常见行为的方法子集,我们有几种不同的定义方法非常见的行为.什么是最好的解决方法?