关于C#:抽象类和接口之间的区别

Difference between abstract class and interface

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Interface vs Base class

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


试着这样想:

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

一个接口创建一个"可以做"的关系。弗雷德可以开车。

而且,弗雷德可以驾驶,但弗雷德是一个人。


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

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

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


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

即。

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)
}