2016-09-11 5 views
-1

Ich habe zwei geerbte Klassen. Diese Klassen haben einige statische Variablen. Was ich tun möchte ist, dass ich Wert eines Objekts auf seinen Kindklassennamen setzen und Kindklassenmethoden mit Elternobjekt aufrufen möchte. Hier ist der Beispielcode:Setzen Sie den Wert der Variablen auf einen Klassennamen

class BlueSwitch : Switch { 
    public static string Foo = "bar"; 
} 

class Green : Switch { 
    public static string Foo = "bar2"; 
} 

Switch oSwitch = BlueSwitch; 
Console.WriteLine(oSwitch.Foo); // should print out "bar" but instead i get compiler error 
oSwitch = GreenSwitch; 
Console.WriteLine(oSwitch.Foo); // should print out "bar2" but instead i get compiler error 

Andere Ideen, wie kann ich das tun?

+1

'Switch oSwitch = BlueSwitch;' wird nicht einmal kompilieren. Sie müssen eine Instanz wie 'Switch oSwitch = new BlueSwitch() erstellen;' – RafaelC

+0

Um über Instanz Ihrer Klassen aufzurufen, müssten Sie eine Instanz "neu" erstellen und dann in diesen Klassen vielleicht eine schreibgeschützte Instanzeigenschaft definieren, die die statische zurückgibt Wert. Aber warum nicht einfach über den statischen 'BlueSwitch.Foo' anrufen? Auch eine schlechte Idee, ein statisches Feld wie dieses zu entlarven, da es nicht readonly ist und von jedem geändert werden könnte – pinkfloydx33

Antwort

2

Was Sie hier tun, ist sehr nicht logisch. Sie ordnen der Variablen oSwitch einen Klassennamen zu. Das ist nicht möglich.

Was sollten Sie tun, ist:

Switch oSwitch = new BlueSwitch(); 
// this will print bar 
oSwitch = new GreenSwitch(); 
// this will print bar2 

Exkurs

Ihre Felder statisch sind, und Ihre Variable oSwitch ist ein Schalter Typ. Wenn Sie möchten, die Dinge richtig tun, entweder machen Sie Ihre Klassenfelder zu öffentlichen Bereichen (was auch schlecht ist) und die statische Sache entfernen, die Sie dies geben:

class BlueSwitch : Switch { 
    public string Foo = "bar"; 
} 

class Green : Switch { 
    public string Foo = "bar2"; 
} 

Oder Sie können sie statisch bleiben lassen, aber Ihre Code wird

string test = BlueSwitch.Foo; 
// writes bar 
test = GreenSwitch.Foo; 
// writes bar2 
Verwandte Themen