抽象类与接口是一样的,除了它是一个实际的类,而不仅仅是一个契约。 为什么界面被称为合同?
答案 0 :(得分:1)
接口和抽象类都是契约,因为它们会绑定你。
但是接口和抽象类之间存在其他差异。
就像你说的那样,如果你需要一个实际的类,包含带有默认值的函数或实际数据成员的内容,或者ctor,那么显然你需要一个抽象类。
但很多时候,接口或抽象类之间的选择在技术上是相同的。有时甚至从长远来看,它也是一样的。
然后,您的决定应基于您正在寻找的性质。
这是您数据类型的额外字符吗?或定义您的数据类型是?
我试图想到任何现实世界的例子,但我找不到任何因为我多年来没有对这个主题做过任何事情,所以我会给你一个类似书的例子。
假设我们有一个抽象类Animal:
public abstract class Animal
{
abstract string Name;
abstract bool IsWild;
abstract bool IsHappy;
}
这可能很容易成为界面。
选择它作为界面实际上不会对您的设计产生任何负面影响。
但就其本质而言,它必须是一个抽象类,因为class Dog
是一种动物。它必须是class Dog : Animal
而不是class Dog : IAnimal
。
作为动物不是Dog
的额外角色。它是定义它。
并且您希望限制所有动物仅从Animal
继承。
IAnimal
让别人继承其他东西。像:
public class Dog : Food, IAnimal {}
有趣的是,有时人们可能会写一个抽象的类什么都没有,只是为了同样的事情。
例如,如果任何Animal
没有共同属性,您仍然愿意这样做:
public abstract class Animal { }
public class Dog : Animal // No actual added value.
{
.........
}
答案 1 :(得分:0)
抽象类与接口相同 不对。接口不定义方法体,私有方法,静态字段/方法等。
抽象方法可以是私有方法,因此不保证外部世界可以访问,接口实现必须公开接口的方法,因此保证"保证"这种方法的存在和可获得性,因此称合同一词。