Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中抽象类继承与实类继承#_C#_.net_Inheritance_Class - Fatal编程技术网

C# C语言中抽象类继承与实类继承#

C# C语言中抽象类继承与实类继承#,c#,.net,inheritance,class,C#,.net,Inheritance,Class,我想知道在使用抽象类和真实类进行继承时,派生类是否有什么不同 在我看来,真正的类继承创建了一个层次结构,而抽象类继承只是将编译器的粘贴代码复制到派生类 抽象类是否创建层次结构?可以使用特殊关键字访问它吗 我知道您使用base关键字访问基类,但是抽象成员看起来就像派生类中的原始成员 最后,这两个类之间的性能差异是什么?是的,抽象类确实存在-编译器不执行复制粘贴。不过,您不会发现任何性能差异,因为CLR仍必须执行虚拟方法调用 例如,下面的C#: 生成以下IL: .class private abst

我想知道在使用抽象类和真实类进行继承时,派生类是否有什么不同

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

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

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


最后,这两个类之间的性能差异是什么?

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

例如,下面的C#:

生成以下IL:

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

.class private auto ansi beforefieldinit Bar
    extends Foo { }

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

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

例如,下面的C#:

生成以下IL:

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

.class private auto ansi beforefieldinit Bar
    extends Foo { }

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

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

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

抽象类的力量在于它没有实现。它可以用来确保派生类的实例将具有所需的全部功能

抽象类的威力在于它没有实现。它可以用来确保派生类的实例具有所需的全部功能,抽象类是基类的原始形式。这些类不能被实例化,这意味着开发人员必须从这些类派生来使用它们的功能。抽象类中定义的任何抽象方法都必须在其子类中实现。因此,可以实现从抽象类派生的子类中必须存在的方法。 因此,您可以定义对象的基本元素,开发人员可以在派生类中根据自己的喜好自定义这些元素


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

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


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

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