2009-07-09 16 views
26

Es posible el acceso a un miembro de los padres en una clase hija ...C# anidado clase de acceso para padres Miembro

class MainClass { 
    class A { Whatever } 

    class B { 
    List<A> SubSetList; 

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

    List<A> MasterList; 
} 

Así que ... mi clase principal tendrá una lista maestra. También tendrá un montón de instancias de B. En cada instancia de B, quiero agregar nuevas A a la B particular, pero solo si existen en la Lista Maestra. Jugué para hacer que MasterList esté estática y funciona ... hasta que tenga más de una instancia de MainClass ... que tendré.

Podría pasar una referencia a MasterList a cada instancia de B, pero eventualmente tendré varias de estas "MasterLists" y no quiero tener que pasar muchas referencias si no es necesario.

Respuesta

22

se puede usar algo como esto:


class B { 
    private MainClass instance; 

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

    List SubSetList; 

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

Independientemente de si anida en la clase B dentro de la clase A, toda instancia de A todavía tendrá que saber sobre la instancia de B en la que se encuentra. Por lo tanto, es posible que desee inicializar A con una referencia a B y mantenerlo en un campo. Esto probablemente incluye anidarlo.

+0

Considero eso también ... ¿Hay un modificador de acceso que limitará el acceso solo a las clases anidadas? – Rob

+0

Bueno, una forma es poner todas estas estructuras de datos en su propio ensamblaje y usar internas en lugar de privadas. –

+0

lo consideré, pero no impide que otras clases accedan a esta lista. No es súper crítico, pero me gustaría que esté lo más limpio posible ... – Rob

5

Con su definición, las instancias de class B pueden acceder a los métodos privados y campos estáticos de class MainClass.

+3

Pero todavía necesita pasar una referencia a la instancia – Jeremy

+1

@Jeremy: me atrapó durante una edición :) –

1

Sí, pero usted tendría que tener una referencia a la instancia de MainClass de dentro de ti instancia de B.

¿Ha pensado en volver a trabajar sus clases un poco? En lugar de tener el método AddNewItem en B, podrías tenerlo en MainClass. De esa forma, sería fácil verificar la MasterList desde MainClass.

1

Esto podría funcionar para usted:

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

A continuación, tendría algo en sus MainClass utilizar el método de la siguiente manera:

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

Resumiendo, podría tener un aspecto similar al siguiente:

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

El problema es que tendré varias instancias de B que agregaré elementos A ... – Rob

+0

I ' Estoy considerando hacer algo similar a esto, pero también incluir una referencia a B ... así que public void AddItem (Lista B, Un elemento) {} .. – Rob

+0

@Rob varias instancias están bien en este caso, solo tiene que cambiar el forma de agregar elementos en su MainClass, pero de esa manera no tiene que preocuparse de que B sepa de su MasterList. – Joseph

14

En C# no existe en realidad ninguna referencia implícita a la instancia de la clase adjunta, por lo que debe pasar tal referencia, y una forma típica de hacerlo es a través del constructor de la clase anidada.

+4

Esto es una pena, porque significa que una clase no es también namspace, a diferencia de C++. – jwg

Cuestiones relacionadas