Einzelvererbung in C # - Objektklasse?

8

Ich habe mir diese Frage schon lange gestellt. Ich dachte daran, es zu veröffentlichen. C # unterstützt keine Mehrfachvererbung (dies ist die Tatsache). Alle Klassen, die in C # erstellt werden, stammen aus der Klasse 'Object' (wiederum eine Tatsache).

Wenn also C # keine Mehrfachvererbung unterstützt, wie können wir dann eine Klasse erweitern, obwohl sie die Objektklasse bereits erweitert?

Veranschaulichen mit einem Beispiel:

  1. Klasse A: Objekt - Klasse A erstellt.
  2. Klasse B: Objekt - Klasse B erstellt.
  3. Klasse A: B - das wird wieder unterstützt. Was passiert mit der früheren Assoziation zum Objekt?

Wir können Objektklassenmethoden in A nach Schritt 3 verwenden. Also ist die Vererbung auf mehrere Ebenen umgestellt. Wenn das der Fall ist, dann

  1. Klasse A: B
  2. Klasse C: B
  3. Klasse A: C - Ich muss auf die Methoden von Klasse B in A zugreifen können. Was ist nicht der Fall?

Kann jemand bitte erklären?

    
Rajeshwaran S P 10.10.2008, 13:59
quelle

8 Antworten

6

Joels Antwort ist richtig. Es gibt einen Unterschied zwischen Mehrfachvererbung und einem Inhertanzbaum (oder einer Ableitungskette). In Ihrem Beispiel zeigen Sie tatsächlich einen Intelligenzbaum: Ein Objekt erbt (leitet sich ab) von einem anderen Objekt, das höher im Baum ist. Mehrfache Vererbung ermöglicht es einem Objekt, von mehreren Basisklassen zu erben.

Nehmen Sie zum Beispiel den folgenden Baum:

%Vor%

Dies ist absolut gültig und besagt, dass SpecialtyDerivedClass von SpecialBaseClass (SpecialtyDerivedClass 'Eltern) erbt, das wiederum von BaseClass (Grandfather der SpecialtyDerivedClass) abgeleitet ist.

Unter der Idee der Mehrfachvererbung würde das Beispiel so aussehen:

%Vor%

Dies ist in .NET nicht erlaubt, aber es besagt, dass SpecialityDerivedClass sowohl von BaseClass als auch von SpecialBaseClass (die beide Eltern sind) erbt.

.NET erlaubt eine Form der Mehrfachvererbung, indem es Ihnen erlaubt, von mehr als einer Schnittstelle zu erben. Ändern Sie das obige Beispiel leicht:

%Vor%

Dies besagt, dass SpecialtyDerivedClass von BaseClass (es ist übergeordnet) und auch ISpecialBase und ISpecialDerived (auch Eltern, aber eher wie step-eltern, da Schnittstellen keine Funktionalität angeben können) erbt.

    
Scott Dorman 10.10.2008, 14:17
quelle
7

Sie verwechseln die mehrfache Vererbung mit einem Vererbungsbaum. Sie können von etwas anderem als dem Objekt erben. Es ist nur, dass das Objekt oben auf deinem Baum sitzt. Und jemand kann Ihre Klasse erben, aber da Object immer noch oben steht, wird diese Klasse auch von Objekt erben. Ihre "Multilevel" -Vererbung ist keine Mehrfachvererbung.

Mehrfache Vererbung ist, wenn Sie von zwei verschiedenen Bäumen erben, und .Net unterstützt das tatsächlich nach einer Mode über Schnittstellen.

    
Joel Coehoorn 10.10.2008 14:03
quelle
4

Alle Klassen letztendlich werden von Object abgeleitet.

%Vor%

entspricht implizit

%Vor%

Wenn Sie von einer anderen Klasse ableiten

%Vor%

wo

%Vor%

B wird die Elternklasse und Objekt wird zur Großelternklasse.

Und so weiter.

Also ist es die Eltern-, Großeltern-, Urgroßeltern (usw.) Klasse aller anderen Klassen.

    
harpo 10.10.2008 14:08
quelle
2

Eine Möglichkeit, um es zu betrachten, ist dies: C # hat eine Vererbung Struktur , während C ++ (oder andere Vererbungssprachen) eine Vererbung Gitter hat.

    
Jeffrey L Whitledge 10.10.2008 14:30
quelle
0

Gegeben unten.

%Vor%

Dies ist gültig. Objekt ist in diesem Fall eine Basis für C.

    
David Basarab 10.10.2008 14:06
quelle
0

In dem Beispiel ist der Grund, dass B A erweitern kann, weil A Objekt erweitert. Eine Klasse kann nur eine Elternklasse angeben, aber diese Klasse muss entweder ein Objekt sein oder ein Objekt als einen ihrer Vorfahren haben.

    
epotter 10.10.2008 14:09
quelle
0

Eine Klasse erbt vom Objekt , wenn Sie keine Basisklasse angeben. Also:

%Vor%

ist dasselbe wie

%Vor%

Wenn Sie jedoch eine Basisklasse angeben, wird sie von dieser Klasse anstelle von Objekt erben. Also,

%Vor%

B erbt direkt von C anstelle von Object. Ein anderes Beispiel,

%Vor%

In diesem Fall erbt A von B anstelle von Object. Zusammenfassend, in dieser Hierarchie:

%Vor%

Klasse A leitet sich von B ab, das von C herrührt. Also wird Klasse A indirekt von C abgeleitet, weil B von C abgeleitet ist. C auch abgeleitet von Object, das nicht explizit spezifiziert ist, aber es ist dort standardmäßig. Also wird A indirekt auch von Object abgeleitet.

    
jop 10.10.2008 14:15
quelle
0

Eine Klasse in C # kann nur einen Elternteil haben, aber sie kann mehrere Vorfahren haben. Sie können mehrere Schnittstellen implementieren, aber das bedeutet nur, dass Ihre Klasse sich bereit erklärt, die von diesen Schnittstellen definierten Signaturen zu implementieren. Sie erben tatsächlich keine Funktionalität von diesen Schnittstellen.

    
tvanfosson 10.10.2008 14:22
quelle

Tags und Links