【问题标题】:Difference between abstract class and interface [duplicate]抽象类和接口之间的区别[重复]
【发布时间】:2011-04-07 19:51:52
【问题描述】:

可能重复:
Interface vs Base class

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

【问题讨论】:

  • 看这个问题:Interface vs Base class
  • 为什么人们会赞成这类问题?
  • @fear:为什么人们会回答它?应该很明显这是重复的。
  • 他们之所以回答,是因为他们可以获得一些赞成票,或者因为它比查找副本更容易(没有激励)。他们投票是因为他们不知道重复的内容,或者......实际上我并不知道。

标签: c# oop interface abstract-class


【解决方案1】:

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

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

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

【讨论】:

  • "如果一个抽象类的所有方法都不完整,那么它就是一个接口。" 应该写成“如果一个抽象类的所有方法都是未完成的AND ABSTRACT那么它就是一个接口。”。 对吗?
【解决方案2】:

试着这样想:

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

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

此外,Fred 可以 IDrive,但 Fred 是一个人。

【讨论】:

    【解决方案3】:

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

    I.E.

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-16
      • 1970-01-01
      • 2012-03-18
      • 1970-01-01
      • 2011-01-01
      • 2013-03-29
      • 2014-01-20
      • 1970-01-01
      相关资源
      最近更新 更多