抽象类Vs接口

时间:2012-08-19 13:27:22

标签: c# interface abstract-class

抽象类与接口是一样的,除了它是一个实际的类,而不仅仅是一个契约。 为什么界面被称为合同?

2 个答案:

答案 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)

  

抽象类与接口相同   不对。接口不定义方法体,私有方法,静态字段/方法等。

抽象方法可以是私有方法,因此不保证外部世界可以访问,接口实现必须公开接口的方法,因此保证"保证"这种方法的存在和可获得性,因此称合同一词。