2009-03-02 13 views
2

Ich frage mich, ob es Unterschiede zu abgeleiteten Klassen gibt, wenn abstrakte vs reale Klassen für die Vererbung verwenden?Zusammenfassung vs reale Klassenvererbung in C#

Es sieht für mich so aus, als würde die echte Klassenvererbung eine Hierarchie erzeugen, während abstrakte Klassenvererbung nur Copy-Paste-Code für den Compiler in abgeleitete Klassen ist?

Erstellt die abstrakte Klasse eine Hierarchie? Kann mit einem speziellen Schlüsselwort darauf zugegriffen werden?

Ich weiß, dass Sie das Basisschlüsselwort verwenden, um auf die Basisklasse zuzugreifen, aber abstrakte Mitglieder sehen genau wie die ursprünglichen Mitglieder in den abgeleiteten Klassen aus?

Schließlich, was ist der Leistungsunterschied zwischen den 2?

+0

Können Sie dies erklären: "abstrakte Mitglieder sehen genauso aus wie die ursprünglichen Mitglieder in den abgeleiteten Klassen?" Wie unterscheidet sich das von nicht-abstrakten Klassen zu erben? – recursive

+0

Sie haben Recht. Ich glaube, ich war verwirrt, dass Sie mit dem Basis-Schlüsselwort auch auf geerbte Mitglieder zugreifen können, aber abstrakte Klassen haben kein spezielles Schlüsselwort. –

+0

"Diese Typen sind nicht 'abstrakt'; sie sind so real wie Int und Float" - Douglas McIlroy –

Antwort

5

Ja, die abstrakte Klasse existiert - der Compiler führt keinen Kopiervorgang durch. Sie werden jedoch keinen Leistungsunterschied feststellen, da die CLR weiterhin virtuelle Methodenaufrufe ausführen muss.

Zum Beispiel der folgenden C#:

abstract class Foo { } 

class Bar : Foo { } 

erzeugen folgende IL:

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

.class private auto ansi beforefieldinit Bar 
    extends Foo { } 

Das Konzept einer abstrakten Art ist sehr viel ein Teil der IL.

3

Der einzige Unterschied besteht darin, dass eine abstrakte Basisklasse nicht instanziiert werden kann, ohne abgeleitet zu werden, während eine nicht abstrakte Basisklasse dies kann. Vom Standpunkt einer abgeleiteten Klasse ist alles gleich.

1

Abstrakte Klassen und konkrete Klassen sind beide Werkzeuge für (OO) Modellierung. Es gibt keinen Unterschied in Bezug auf die Vererbungs- und Substitutionsregeln. Es gibt ein paar technischen Details:

  • Eine abstrakte Klasse nicht instanziiert werden kann
  • Abstrakte Methoden sind nur in abstrakten Klassen erlaubt

Aber eine abstrakte Klasse kann nicht abstrakte Methoden, Eigenschaften und Felder.

Leistung bezieht sich nicht auf die Klassen, aber es gibt eine kleine Strafe für abstrakte/virtuelle Methoden.

0

Die Kraft der abstrakten Klasse ist darin Unimplementation. Es kann für das Vertrauen verwendet werden, dass Instanz von abgeleiteten Klassen die vollständig benötigte Funktionalität haben wird

0

Abstrakte Klasse ist eine primitive Form einer Basisklasse. Diese können nicht instanziiert werden, was bedeutet, dass der Entwickler von diesen Klassen ableiten muss, um ihre Funktionalität zu nutzen. Jede in der abstrakten Klasse definierte abstrakte Methode muss in ihrer Kindklasse implementiert werden. So kann man Methoden implementieren, die in der Kindklasse vorhanden sein müssen, die von der abstrakten Klasse abgeleitet ist. Sie definieren also grundlegende Elemente eines Objekts, die vom Entwickler in einer abgeleiteten Klasse wie gewünscht angepasst werden können.

Nicht abstrakte Klassen werden am besten verwendet, um eine Klassenfunktionalität zu erweitern, während auch weiterhin verwendet wird, was in der nicht-abstrakten Klasse ist. Auf alle nicht-privaten Member und Methoden kann von der abgeleiteten Klasse zugegriffen werden.