【问题标题】:Abstract vs real class inheritance in C#C#中的抽象与真实类继承
【发布时间】:2010-10-10 21:11:44
【问题描述】:

我想知道在使用抽象类和真实类进行继承时,派生类是否有任何区别?

在我看来,真正的类继承创建了一个层次结构,而抽象类继承只是将编译器的代码复制粘贴到派生类?

抽象类是否创建层次结构?可以用特殊关键字访问吗?

我知道你使用base关键字访问基类,但是抽象成员看起来就像派生类中的原始成员?

最后两者之间的性能差异是什么?

【问题讨论】:

  • 您能否解释一下:“抽象成员看起来就像派生类中的原始成员?”这与继承非抽象类有何不同?
  • 你是对的。我想我很困惑,您也可以使用 base 关键字访问继承的成员,但抽象类没有特殊关键字。
  • “这些类型不是‘抽象的’;它们与 int 和 float 一样真实”- Douglas McIlroy

标签: c# .net inheritance class


【解决方案1】:

是的,抽象类确实存在——编译器不进行复制粘贴。您不会发现任何性能差异,因为 CLR 仍然必须执行虚拟方法调用。

例如下面的 C#:

abstract class Foo { }

class Bar : Foo { }

生成以下 IL:

.class private abstract auto ansi beforefieldinit Foo
    extends [mscorlib]System.Object { }

.class private auto ansi beforefieldinit Bar
    extends Foo { }

抽象类型的概念在很大程度上是 IL 的一部分。

【讨论】:

    【解决方案2】:

    唯一的区别是抽象基类不能在没有派生的情况下被实例化,而非抽象基类可以。从派生类的角度来看,一切都是一样的。

    【讨论】:

      【解决方案3】:

      抽象类的强大之处在于它没有实现。它可用于确保派生类的实例将具有所需的全部功能

      【讨论】:

        【解决方案4】:

        抽象类是基类的原始形式。这些无法实例化,这意味着开发人员必须从这些类派生才能使用它们的功能。抽象类中定义的任何抽象方法都必须在其子类中实现。因此,可以实现必须存在于从抽象类派生的子类中的方法。 因此,您可以定义对象的基本元素,开发人员可以根据需要在派生类中自定义这些元素。

        非抽象类最好用于扩展类功能,同时继续使用非抽象类中的内容。派生类可以访问所有非私有成员和方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多