2 Stimmen

Zugriff auf Unterklasse in Basisklasse... aber anders

Ich habe eine Basisklasse, die eine Unterklasse hat (könnte eine Struktur ich vermuten, aber nicht sicher, wenn es angemessen ist) und eine Methode.

class Base 
{
    protected class SubClass 
    {
        public string word;
        public int number;
    }

    protected void SomeMethod()
    {
        this.SubClass.word //this is where I'm struggling
    }
}

Dann habe ich ein paar Kind-Klassen, die meine baseClass implementieren, instanziieren die Base.SubClass und fügen Sie einige Werte zu der instanziierten Klasse.

class ChildClass1 : Base
{
    public childSubClass = new SubClass();

    public void DoSomethingRidiculous()
    {
        childSubClass.word = "WhoFarted";
    }
} 

class ChildClass2 : Base
{
    public childSubClass = new SubClass();

    public void DoSomethingRidiculous()
    {
        childSubClass.word = "ItStinks";
    }
}

Wenn möglich, möchte ich in der Lage sein, den Wert von SubClass.word aus der Basisklasse zu erhalten. Ich denke, dass mein Versuch, meine Idee zu implementieren, wahrscheinlich falsch ist.

3voto

sll Punkte 59134

Ich bin mir nicht sicher, ob Sie wirklich eine Unterklassenbildung/Klassenverschachtelung benötigen. Verschieben Sie einfach die Klasse SubClass Deklaration und deklarieren geschütztes Feld/Eigenschaft von SubClass Typ stattdessen.

public class SubClass 
{
   public string word;
   public int number;
}

public class Base 
{
    protected SubClass subClassInstance = new SubClass();

    protected void SomeMethod()
    {
        this.subClassInstance.word //this is where I'm struggling
    }
}

Dann können Sie auf subClassInstance innerhalb beider ChildClass1 y ChildClass2

1voto

Jon Punkte 411383

Die Basisklasse hat kein Feld und keine Eigenschaft vom Typ SubClass Daher können Sie das, was Sie vorschlagen, definitiv nicht direkt tun.

Eine Lösung wäre das Hinzufügen des Feldes

public childSubClass = new SubClass();

zum Unterricht Base selbst. Gibt es dabei ein Problem?

Die andere Lösung wäre die Verwendung von Reflexion, um den Wert des Feldes zu erhalten, vorausgesetzt, das Objekt, über das Sie reflektieren, hat ein solches Feld. Das ist wirklich weit hergeholt und obwohl es Ihnen technisch ermöglichen könnte, das zu tun, was Sie vorschlagen, riecht der Code sehr schlecht.

1voto

Anthony Pegram Punkte 119149

Eine Basisklasse kann nicht (oder sollte nicht) auf Mitglieder abgeleiteter Klassen zugreifen, und normalerweise nicht einmal wissen über abgeleitete Klassen (es gibt einige Ausnahmen, wie z. B. im Fall des State Patterns). Wenn die Basisklasse Zugriff auf ein Mitglied haben soll, sollte es in der Basisklasse deklariert werden. Wenn abgeleitete Klassen ebenfalls in der Lage sein sollen, dieses Mitglied zu verwenden, dann markieren Sie das Mitglied als geschützt.

class Base
{
     protected Foo someFoo;

     void Frob()
     {
         // can access methods/properties of someFoo instance
     }
}

class Child 
{
    public Child() 
    {
        someFoo = new Foo(); // child can also access someFoo
    }
}

1voto

ShaneBlake Punkte 10946

Ich bin nicht sicher, warum Sie eine Unterklasse machen, anstatt nur diese beiden Eigenschaften der Basisklasse zu machen, aber der Grund, warum Sie Probleme mit dieser Zeile haben:

this.SubClass.word //this is where I'm struggling 

ist, weil Sie SubClass nicht als Eigenschaft der Basisklasse instanziieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X