接口vs基类
什么时候应该使用接口,什么时候应该使用基类?
如果我不想实际定义方法的基本实现,它应该总是一个接口吗?
如果我有狗和猫课。 为什么我要实现IPet而不是PetBase? 我可以理解为ISheds或IBarks(IMakesNoise?)提供接口,因为这些接口可以放在一个宠物的宠物基础上,但我不明白哪个用于通用宠物。
让我们举一个Dog和一个Cat类的例子,让我们用C#来说明:
狗和猫都是动物,特别是四足哺乳动物(动物过于宽泛)。 让我们假设你有一个抽象类哺乳动物,他们都是:
public abstract class Mammal
这个基类可能会有默认的方法,例如:
所有这些行为在两个物种之间或多或少具有相同的实现。 要定义这个,你将有:
public class Dog : Mammal
public class Cat : Mammal
现在假设还有其他哺乳动物,我们通常会在动物园看到:
public class Giraffe : Mammal
public class Rhinoceros : Mammal
public class Hippopotamus : Mammal
这仍然是有效的,因为Feed()
和Mate()
函数的核心仍然是相同的。
然而,长颈鹿,犀牛和河马不完全是你可以制造宠物的动物。 这就是界面将会很有用的地方:
public interface IPettable
{
IList<Trick> Tricks{get; set;}
void Bathe();
void Train(Trick t);
}
上述合同的执行情况在猫与狗之间并不相同; 把他们的实现放在一个抽象类中来继承将是一个坏主意。
你的狗和猫的定义现在应该如下所示:
public class Dog : Mammal, IPettable
public class Cat : Mammal, IPettable
从理论上讲,你可以从更高级的基类中覆盖它们,但本质上来说,一个接口允许你仅仅将需要的东西添加到类中,而不需要继承。
因此,因为通常只能从一个抽象类继承(在大多数静态类型的OO语言中,它们是......异常包括C ++),但是能够实现多个接口,因此它允许您严格按照要求构建对象。
那么,乔希布洛赫自己在有效的Java 2D:
比抽象类更喜欢接口
一些要点:
现有的类可以很容易地改进来实现一个新的界面 。 你所要做的就是添加必要的方法,如果它们还不存在,并为类声明添加一个implements子句。
接口是定义混合的理想选择 。 松散地说,mixin是一种类,除了它的“主类型”外,类还可以声明它提供了一些可选行为。 例如,Comparable是一个mixin接口,它允许一个类声明其实例相对于其他可相互比较的对象进行排序。
接口允许构建非分层类型的框架 。 类型层次结构对于组织某些事物非常有用,但其他事物并不完全落入僵化的层次结构中。
接口通过包装类成语实现了安全,强大的功能增强 。 如果您使用抽象类来定义类型,那么您将让程序员想要添加功能,但别无选择,只能使用继承。
此外,通过提供一个抽象的骨架实现类来与您导出的每个非平凡接口一起使用,您可以将接口和抽象类的优点结合起来。
另一方面,接口很难发展。 如果你向接口添加一个方法,它将会破坏所有的实现。
PS:买书。 这是更详细的。
现代风格是定义IPet和PetBase。
接口的优点是其他代码可以使用它,而与其他可执行代码无关。 完全“干净”。 接口也可以混合使用。
但是基类对于简单的实现和通用工具很有用。 所以提供一个抽象基类以节省时间和代码。
链接地址: http://www.djcxy.com/p/8859.html