C#, Zugriff auf die untergeordneten Eigenschaften vom parent-Referenz?
public void GetProps(Parent p){
//want to access lots of child properties here
string childProp1 = p.prop1;
bool childProp2 = p.prop2;
bool childProp3 = p.prop3;
}
Jedoch compiler beschwert sich, dass
"Parent enthält keine definition prop1"
Wäre die Funktion nehmen in den verschiedenen Subtypen der Klasse Parent.
Alle Unterklassen müssen diese
public override string prop1 { get; set; }
Gibt es eine Möglichkeit, dies zu erreichen?
EDIT:
Um die Frage klarer
Ich habe derzeit einen riesigen if-elseif, wo ich so etwas machen
if(p is Child0){
Child0 ch = p as Child0;
//want to access lots of child properties here
string childProp1 = ch.prop1;
bool childProp2 = ch.prop2;
bool childProp3 = ch.prop3;
}else if(p is Child1){
Child1 ch = p as Child1;
//want to access lots of child properties here
string childProp1 = ch.prop1;
bool childProp2 = ch.prop2;
bool childProp3 = ch.prop3;
}else if(...//and many more
Nun wollte ich entfernen Sie alle redundanten code und stellen Sie eine Funktion, die in der Lage alle diese.
Ich habe geantwortet, so gut ich kann angesichts der lückenhaften Informationen, die - wenn Sie könnten mehr Kontext über das, was Sie versuchen zu erreichen, dass wirklich helfen würde.
Wie verwenden Sie das Schlüsselwort ref wird als variable parameter?
bearbeitet von Frage
wir müssen sehen, was die Übergeordnete definition, nicht das Kind; ist prop1 erklärt, in der Übergeordneten Klasse als public?
kommentiert haben diese in Jon ' s Antwort.
Wie verwenden Sie das Schlüsselwort ref wird als variable parameter?
bearbeitet von Frage
wir müssen sehen, was die Übergeordnete definition, nicht das Kind; ist prop1 erklärt, in der Übergeordneten Klasse als public?
kommentiert haben diese in Jon ' s Antwort.
InformationsquelleAutor Kevin Boyd | 2012-04-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn alle untergeordnete Klassen müssen die Eigenschaften (aber mit unterschiedlichen Implementierungen), sollten Sie erklären, wie abstrakte Eigenschaften in der Basisklasse (
Parent
), dann setzen Sie in den untergeordneten Klassen.Wenn einige abgeleitete Klassen, die nicht diese Eigenschaften haben, dann was würden Sie erwarten, dass Ihre aktuellen
GetProps
zu tun?EDIT: Wenn du mit C# 4-und Sie definitiv kann nicht eine bessere Klasse design (wo der übergeordneten Klasse deklariert die Eigenschaft), die Sie nutzen könnten dynamische Typisierung:
Ich würde behandeln Sie dies als letzten Ausweg, wenn...
Ich bezweifle, dass die Unterklassen haben
override
es sei denn, die Immobilie tatsächlich in der base-Klasse... Wenn Sie ihm geben könnte eine kurze, aberJon, der erbschaft-Linie ist Recht lang. Und ich bin mit dem Bezug der obersten Muttergesellschaft, z.B. Eltern ---> SubP10 ----> SubP9 ---> SubP8 ...-----> Kind. Einer der Eltern kann die definiton von prop1.
Sie müssen also geben Sie uns eine Vertreter Beispiel -, die Ihre aktuelle Frage nicht. Wenn
Parent
nicht erklärenprop1
, was würden Sie erwarten, dass Ihr code, um zu tun, wenn es bei einer bestimmten Instanz eines Typs, die nicht haben?Dann ist das die Art Ihre Methode nehmen sollte, eher als die Muttergesellschaft
InformationsquelleAutor Jon Skeet
Wie ich verstanden habe aus Ihrer Frage, die Sie zugreifen möchten, Kinder, die Schüler vom Objekt der Übergeordneten Klasse.
Dieses Verhalten ist nicht erlaubt in OOP.
Ein Weg kann sein, so der Vorschlag von Jon Skeet zum erstellen einer Abstrakten Klasse und implementieren Sie die gewünschten Mitglieder in den Kinder-Klassen.
Umgekehrt werden können, vergeben Sie die erforderlichen Werte auf die Mitglieder der Basisklasse in abgeleitete Klasse den Konstruktor mit dem base bauen. Ich weiß nicht, dieser wird Ihr problem lösen-oder nicht. Aber Betrachten Sie das folgende Codefragment zum Beispiel:
O/P
Vorname : Basisklasse
Nachname : Basis-Klasse
Vorname : Basisklasse
Nachname : Abgeleitete Klasse
Vorname : Basisklasse
Nachname : Abgeleitete Klasse
Lassen Sie mich wissen, wenn es hilft.
InformationsquelleAutor Pank
Die Lösung, falls jemand es brauchen, es ist nur die Besetzung der Klasse, die Sie als Referenz wie folgt:
InformationsquelleAutor D.B
Wenn die Eigenschaft definiert ist, in eine Zwischenklasse zwischen Eltern und Kind, und Sie haben nicht einen Verweis auf die intermediate-Klasse zur design-Zeit, dann könnte man die reflektion verwenden, um das Eigentum. Aber es klingt wie Sie sollten mit den wichtigsten sub-parent anstatt einfach die Eltern.
InformationsquelleAutor Xhalent
Wenn ich dich richtig verstanden habe (- ich gehe davon aus
Parent
ist eine Basisklasse, von derChild0
Child1
etc Erben.) – du bist nur fehlt eine Erklärung derprop1
im übergeordneten. Es wird nicht in die Quere kommen, wird es einfach überschrieben werden.Schauen Sie sich dieses Beispiel (die gibt "Kind " string") und beachten Sie, dass
child
an eine Methode übergeben wird, die erwartet, dass einParentClass
Instanz.InformationsquelleAutor ispiro