可能重复:
Interface vs Base class
我不了解抽象类和接口之间的区别。我什么时候需要使用哪种类型的艺术?
答案 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)
}