[英]Abstract class Vs Interface
抽象类与接口相同,只是它是一个实际类,而不仅仅是合同。 为什么接口被称为合同?
接口和抽象类都是契约,因为它们绑定了您。
但是接口和抽象类之间还有其他区别。
就像您说的那样,如果您需要一个实际的类,该类具有函数的内容或具有默认值的实际数据成员或ctor,那么显然您将需要一个抽象类。
但是很多时候,接口还是抽象类之间的选择在技术上都是相同的。 甚至从长远来看,有时也会一样。
然后,您的决定应基于所寻找内容的性质 。
它是数据类型的额外字符吗? 还是定义您的数据类型是什么?
我尝试过考虑任何真实的示例,但是由于多年以来我都没有做任何事情,所以找不到任何示例,因此我将为您提供一个类似书的示例。
假设我们有一个抽象类Animal:
public abstract class Animal
{
abstract string Name;
abstract bool IsWild;
abstract bool IsHappy;
}
这本来可以是一个接口。
选择它作为接口实际上不会对您的设计产生任何负面影响。
但是就其性质而言,它必须是抽象类,因为class Dog
是动物。 它必须是class Dog : Animal
class Dog : IAnimal
而不是class Dog : IAnimal
。
做动物不是Dog
的额外特征。 它定义了什么。
并且您希望限制所有动物仅从Animal
继承。
IAnimal
让某人继承其他东西。 喜欢:
public class Dog : Food, IAnimal {}
有趣的是,有时可能为了同一件事而写一无所有的抽象类。
例如,如果没有任何Animal
共同财产,您仍然会喜欢:
public abstract class Animal { }
public class Dog : Animal // No actual added value.
{
.........
}
抽象类与接口是同一件事不正确。 接口未定义方法主体,私有方法,静态字段/方法等。
抽象方法可以是私有方法,因此不能保证可以被外界访问,接口实现必须公开接口方法,从而“保证”此类方法的存在和可访问性,因此称为合同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.