Difference between abstract class and interface
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Interface vs Base class
我不理解抽象类和接口之间的区别。我什么时候需要使用哪种类型的艺术?
试着这样想:
抽象类创建"is-a"关系。大众车是一辆汽车。
一个接口创建一个"可以做"的关系。弗雷德可以开车。
而且,弗雷德可以驾驶,但弗雷德是一个人。
当我们创建一个接口时,我们基本上创建了一组方法,没有任何必须被实现的类重写的实现。其优点是,它提供了一种方法,使类成为两个类的一部分:一个来自继承层次结构,另一个来自接口。
当我们创建一个抽象类时,我们正在创建一个可能有一个或多个已完成方法的基类,但至少有一个或多个方法未完成并声明为抽象的。如果抽象类的所有方法都未完成,则它与接口相同。抽象类的目的是为一组派生类的工作方式提供一个基类定义,然后允许程序员在派生类中填充实现。
抽象类可能是带有一些抽象方法和一些非抽象方法的类。他们做一些事情(有相关的代码)。如果是新的非抽象类,则子类化抽象类,它必须实现抽象方法。
即。
1 2 3 4 5 6 7 8 9 10 11 | 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"; } } |
接口更像是一个协议。实现该接口的类必须具有的方法列表。但他们什么都不做。他们只有方法原型。
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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++中没有协议/接口,两者都经常被混淆。因此,用这种语言模拟接口行为的方法是编写一个纯虚拟类(只包含纯虚拟函数的类)。
1 2 3 | class A { virtual int a() = 0; // pure virtual function (no implementation) } |