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

What is the difference between an abstract class and an interface?

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

Possible Duplicate:
Interface vs Abstract Class (general OO)

我能实例化一个抽象类吗?如果是这样,为什么我不把所有非密封类都抽象化呢?

如果我不能实例化它,那么与接口有什么区别?抽象类可以具有"基类"功能吗?接口和抽象类之间的区别比这更大吗?


无法实例化抽象类。

抽象类和接口之间的区别在于,抽象类可以具有方法的默认实现,因此,如果不在派生类中重写这些方法,则使用抽象基类实现。接口不能有任何实现。


接口不提供实现。您还可以实现多个接口。

可以在抽象类内部提供实现,但只能从一个基类型继承。

在这两种情况下,都不能直接实例化任何一个。


抽象类:

  • 抽象类可以包含抽象方法和非-抽象方法。

  • 当非抽象类从抽象类继承时类,非抽象类应提供继承的抽象方法的实现。

  • 接口:

  • 接口只是纯抽象类ie接口只能包含函数声明。

  • 默认情况下,接口的所有成员都是公共的并且不能提供任何访问修饰符。

  • 当从接口继承类时,继承的类应提供继承的成员。


  • 不能直接创建抽象类的实例。但是,您可以提供方法和/或属性实现,这在接口中是无法实现的。此外,您只能继承一个抽象类或其他类,而您可以继承(实现)任意多个接口。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    abstract class A
    {
        public int Foo() { return 1; } // implementation defined
    }

    class B : A
    {
    }

    interface C
    {
        int Foo() {return 1;} // not legal, cannot provide implementation in interface
    }

    // ... somewhere else in code

    A a = new A(); // not legal
    A a = new B(); // legal

    接口定义了一个契约,您的说法是您将观察一组特定方法签名的实现。

    抽象类只是意味着您不能直接创建它的新实例,您可以自由地使用任何其他类特性,即属性。


    一方面:您只能从一个抽象类继承。可以将多个接口附加到一个类。