2009-07-09 16 views
26

Ist es möglich, ein übergeordnetes Element in einer untergeordneten Klasse zugreifen ...C# Verschachtelte Klasse Zugriff Elternteil Mitglied

class MainClass { 
    class A { Whatever } 

    class B { 
    List<A> SubSetList; 

    public void AddNewItem(A NewItem) { 
     Check MasterListHere ???? 
    } 
    } 

    List<A> MasterList; 
} 

Also ... meine Hauptklasse eine Masterliste hat. Es wird auch eine Menge von Instanzen von B haben. In jedem Fall von B möchte ich neue A's zu dem bestimmten B hinzufügen, aber nur wenn sie in der Hauptliste existieren. Ich spielte mit der MasterList statische und es funktioniert ... bis ich mehr als eine Instanz von MainClass habe ... die ich haben werde.

Ich könnte einen Verweis auf MasterList zu jeder Instanz von B übergeben, aber ich werde schließlich mehrere dieser "MasterLists" haben und ich möchte nicht viele Referenzen übergeben müssen, wenn ich nicht muss.

Antwort

22

Sie können so etwas wie folgt verwenden:


class B { 
    private MainClass instance; 

    public B(MainClass instance) 
    { 
     this.instance = instance; 
    } 

    List SubSetList; 

    public void AddNewItem(A NewItem) { 
     Check MasterListHere ???? 
    } 
    } 
1

Unabhängig davon, ob Sie Klasse B in Klasse A verschachteln, muss jede Instanz von A immer noch über die Instanz von B wissen, in der sie gespeichert ist. Vielleicht möchten Sie A mit einem Verweis auf B initialisieren und es in einem Feld behalten. Dies schließt wahrscheinlich das Verschachteln derselben ein.

+0

Ich dachte das auch ... Gibt es einen Zugriffsmodifizierer, der den Zugriff nur auf verschachtelte Klassen beschränkt? – Rob

+0

Nun, eine Möglichkeit besteht darin, alle diese Datenstrukturen in ihre eigene Assembly zu stellen und intern statt privat zu verwenden. –

+0

Ich habe das berücksichtigt, aber es verhindert nicht, dass andere Klassen auf diese Liste zugreifen. Es ist nicht superkritisch, aber ich möchte, dass es so sauber wie möglich ist ... – Rob

5

Mit Ihrer Definition können Instanzen von class B auf die privaten Methoden und statischen Felder von class MainClass zugreifen.

+3

Aber Sie müssen immer noch einen Verweis auf die Instanz übergeben – Jeremy

+1

@ Jeremy: erwischt mich während einer Bearbeitung :) –

1

Ja, aber Sie würden einen Verweis auf die Instanz von Mainclass aus dir Instanz von B.

Haben Sie daran gedacht haben, müssen Sie Ihre Klassen ein wenig wieder zu arbeiten? Anstatt die AddNewItem-Methode in B zu verwenden, können Sie sie in MainClass verwenden. Auf diese Weise ist es einfach, die MasterList in der MainClass zu überprüfen.

1

Dies könnte für Sie arbeiten:

public void AddNewItem(A newItem, Func<A, bool> checkForItemInMasterList) 
{ 
    if (checkForItemInMasterList.Invoke(newItem) 
     SubList.Add(newItem); 
} 

Sie würden dann etwas in Ihrem Mainclass haben, um das Verfahren wie folgt zu verwenden:

public void AddItem(A newItem) 
{ 
    new B().AddNewItem(newItem, x => MasterList.Contains(x)); 
} 

Zusammengefasst könnte es in etwa so aussehen:

class MainClass { 
    class A { Whatever } 

    class B { 
    List<A> SubSetList; 

    public void AddNewItem(A newItem, Func<A, bool> checkForItemInMasterList) 
    { 
     if (checkForItemInMasterList.Invoke(newItem) 
      SubList.Add(newItem); 
    } 
    } 

    //I don't know how you're adding items to instances of B. 
    //This is purely speculative. 
    public void AddItem(A newItem) 
    { 
     new B().AddNewItem(newItem, x => MasterList.Contains(x)); 
    } 

    List<A> MasterList; 
} 
+0

Problem ist, dass ich mehrere Instanzen von B haben werde, dass ich A Elemente hinzufügen werde ... – Rob

+0

ich ' Ich überlege, etwas Ähnliches zu tun, aber auch einen Verweis auf B, also public void AddItem (B-Liste, A-Item) {} .. – Rob

+0

@Rob mehrere Instanzen sind in Ordnung in diesem Fall, müssen Sie nur ändern So fügen Sie Elemente in Ihrer MainClass hinzu, aber Sie müssen sich nicht darum kümmern, dass B von Ihrer MasterList weiß. – Joseph

14

In C# gibt es eigentlich keinen impliziten Verweis auf die Instanz der einschließenden Klasse, daher müssen Sie einen solchen Verweis übergeben, und eine typische Vorgehensweise hierfür ist der Konstruktor der geschachtelten Klasse.

+4

Das ist eine Schande, weil es bedeutet, dass eine Klasse anders als in C++ kein Namespace ist. – jwg

Verwandte Themen