2010-12-03 14 views
0

nehme an, wir haben zwei Klassen Auto und Fahrer ,,
und wir sind in der Lage Objekt wielaufendes Auto c = neuer Fahrer(); in C#

Car c=new Driver(); 

und für unsere Mitglieder von Car-Klasse aufrufen, aber nicht von Treiberklasse zu machen Warum und Wann? ?

+0

Versuchen Sie, mehr von Ihrem Code zu veröffentlichen - es ist schwer, ohne mehr Kontext zu helfen. –

+1

Wie würden Sie ein Objekt erstellen können, wenn 'Driver' irgendwie von' Car' erbt (was keinen Sinn ergibt)? – BoltClock

+0

Markiere das bitte als Hausaufgabe. – VVS

Antwort

0

Wenn Sie sicher sind, dass Car ist eigentlich ein Driver, dann können Sie es zu einem driver werfen die Mitglieder Driver zuzugreifen. Also entweder

((Driver)c).DriverMember(); 

Dies wird eine Ausnahme auslösen, wenn c ist keine Driver

Oder

Driver d = c as Driver; 
if(d != null){ 
    d.DriverMethod(); 
} 

Der Grund dafür ist, dass seit c vom Typ Car, dann nur Car-Mitglieder zur Verfügung stehen.

Zum Beispiel haben Sie List<Car>, wo Sie einige Car Objekte und einige Driver Objekte hinzufügen. Dann gibt es einen perfekten Sinn, dass nur Car Mitglieder zu verwenden sind.

Auch ich davon aus, dass Driver von Car in diesem Fall erbt (das ist eigentlich eine ziemlich seltsame Erbschaft, da ein Fahrer nicht ein Auto).

7

Obwohl der Verweis c auf ein Driver Objekt zeigt, bestimmt der Typ der Referenz (Car), welche Methoden darauf aufgerufen werden können.

Als eine Randnotiz, Driver als eine Klasse von Car abgeleiteten Klasse macht nicht viel Sinn. Klassenvererbung kann normalerweise als eine "ist-a" -Beziehung ausgedrückt werden, und die meisten Fahrer sind keine Autos.

0

In Ihrem Fall ist Auto die Basisklasse des Treibers. Dies ist der Punkt, warum Sie ein neues Treiberobjekt erstellen, aber in ein Auto-Objekt "packen" können.

Der Grund, warum nur das Mitglied der Klasse "Auto" sichtbar ist, ist, dass Ihr Objekt c vom Typ Auto ist und nicht vom Typ Fahrer und Auto weniger Mitglieder als Fahrer hat.