抽象类和接口之间的区别

可能重复:
接口与基类

我不理解抽象类和接口之间的区别。 我什么时候需要使用哪种类型的艺术品?

当我们创建一个接口时 ,我们基本上创建了一组方法,没有任何必须被实现的类重写的实现。 它的优点是它为类提供了一种方法,使其成为两个类的一部分:一个来自inheritance层次结构,另一个来自接口。

当我们创建一个抽象类时 ,我们创建一个可能有一个或多个已完成方法的基类,但至少有一个或多个方法未完成并声明为抽象。 如果抽象类的所有方法都未完成,那么它与接口相同。 抽象类的目的是为一组派生类如何工作提供基类定义,然后允许程序员填充派生类中的实现。

article along with the demo project discussed Interfaces versus Abstract classes.

试着这样想:

抽象类创建“is-a”关系。 大众汽车是一辆汽车。

界面创建“可以做”的关系。 弗雷德可以 IDrive。

此外,弗雷德可以 IDrive,但弗雷德是一个人。

抽象类可能带有一些抽象方法和一些非抽象方法。 他们做的东西(有相关的代码)。 如果是一个新的非抽象类,则为抽象类创建子类,它必须实现抽象方法。

IE

 public abstract class A { public string sayHi() { return "hi"; } // a method with code in it public abstract string sayHello(); // no implementation } public class B : A { // must implement, since it is not abstract public override string sayHello() { return "Hello from B"; } } 

接口更像是一个协议。 实现该接口的类必须具有的方法列表。 但他们什么都不做 。 他们只有方法原型。

 public interface A { string sayHi(); // no implementation (code) allowed string sayHello(); // no implementation (code) allowed } public class B : A { // must implement both methods string sayHi() { return "hi"; } string sayHello() { return "hello"; } } 

两者都经常混淆,因为C ++中没有协议/接口。 因此,模拟该语言中的接口行为的方法是编写纯虚拟类 (仅具有纯虚函数的类)。

 class A { virtual int a() = 0; // pure virtual function (no implementation) }