2009-08-29 20 views
0

Ich habe eine Klasse, die von einer anderen erbt, und ich möchte eine der Basisklassenfunktionen verwenden ... aber ich stoße auf ein Problem, wo Aufruf der Basisfunktion nicht die Membervariable aus der geerbten Klasse als I zurückgibt hatte gehofft.C# Vererbung, Zugriff auf untergeordnete Elemente mit Basisfunktionen?

Um mein Problem zu veranschaulichen, habe ich ein vereinfachtes Beispiel erstellt. Ich erwartete dieses Beispiel, um "5" auszugeben, aber es tut nicht :) Die Lösung scheint zu sein, dass ich die getInt() Funktion von myclass1 in myclass2 auch kopieren muss ... dann wird es funktionieren, aber das scheint zu besiege den Punkt der Vererbung von myclass1 (ich wollte vermeiden, die Funktion in jeder Klasse zu duplizieren).

class Program 
{ 
    static void Main(string[] args) 
    { 
     myclass2 myclass = new myclass2(); 

     // Expected to output 5, but it actually outputs 0 
     Console.WriteLine(myclass.getInt()); 
    } 
} 

struct s1 
{ 
    public string str; 
    public int num; 
} 

struct s2 
{ 
    public int num; 
    public int num2; 
} 

class myclass1 
{ 
    internal s1 mystruct; 

    internal int getInt() 
    { 
     return mystruct.num; 
    } 
} 

class myclass2 : myclass1 
{ 
    internal new s2 mystruct; 

    internal myclass2() 
    { 
     mystruct.num = 5; 
    } 
} 

Antwort

5

Sie verstecken sich myclass1.mystruct mit myclass2.mystruct. Sie sind zwei völlig verschiedene Objekte.

Sie können das Objekt überschreiben, indem Sie es in der Basisklasse virtual und override in der Unterklasse machen, aber das Objekt muss seinen Typ behalten. Sie können den Typ einer Instanz nicht ändern, da dies nicht typsicher ist. (FIXME) Wenn Sie den Typ mystruct ändern möchten, warum?

Wenn Sie nur myclass1.mystruct von myclass2 zugreifen möchten, können Sie verwenden, denke ich.

+0

Ja strager ist richtig. Stattdessen können Sie es einfach in der Basisklasse schützen und nicht deklarieren + initialisieren, einfach einstellen, als würde es geschützt und Klasse2 erben, es sollte Zugriff haben, ich glaube nicht, dass Sie das interne wollen. – David

+0

Danke Jungs - leider muss die Art von Mystruct in beiden Klassen unterschiedlich sein. Das gesamte Projekt ist ein Wrapper um einige C++ - APIs und die API wird mit zwei verschiedenen Strukturen versioniert, die dasselbe darstellen. Die XP-Version der Struktur hat andere Inhalte als die Vista-Version und mein Code muss unabhängig vom Betriebssystem sein. Ich habe versucht, dieses Szenario im obigen Beispiel zu vereinfachen. Gibt es eine Möglichkeit, dies zu erreichen, ohne nur die Funktion getInt() in myclass2 zu kopieren? (Es scheint, als ob es keinen Sinn hat, in diesem Stadium zu erben) –

+0

@DaveUK, Können Sie genauer auf Ihr Problem eingehen? Ist jede "Myclass" ein Betriebssystem? Hätten Sie nicht eine Betriebssystemklasse "Basis" und dann mehrere Betriebssystemspezifische Unterklassen? – strager

Verwandte Themen