抽象类和接口之间的区别

时间:2010-09-03 12:15:22

标签: c# oop interface abstract-class

  

可能重复:
  Interface vs Base class

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

3 个答案:

答案 0 :(得分:16)

尝试这样想:

抽象类会创建“is-a”关系。 Volkswagon 汽车。

界面会创建“可以做”的关系。 Fred 可以 IDrive。

此外,Fred 可以 IDrive,但Fred 人。

答案 1 :(得分:12)

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

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

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

答案 2 :(得分:1)

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

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