2009-05-11 15 views
13

Suponiendo que tenemos una clase InnerClass con atributos y getter/setter. También tenemos una clase OuterClass que contiene InnerClass.getter y setter para la clase en la clase C#

p. Ej.

class InnerClass 
{ 
    private int m_a; 
    private int m_b; 

    public int M_A 
    { 
     get 
     { 
      return m_a; 
     } 
     set 
     { 
      m_a = value; 
     } 
    } 
} 

class OuterClass 
{ 
    private InnerClass innerClass 
} 

¿Cómo implementaría un getter y setter correcto para el miembro innerClass de OuterClass?

¡Gracias de antemano!

+0

"set" debe ser {m_a = value;} –

+0

tienes que arreglar el representante que conoces;) – annakata

Respuesta

24

La sintaxis no sería diferente. Sólo ...

public InnerClass InnerClass 
{ 
    get { return innerClass; } 
    set { innerClass = value; } 
} 

Por cierto, si usted está usando C# en .NET 3.5, puede utilizar la característica de generación automática de propiedad si todo lo que tienes es una propiedad sencilla que simplemente lee y escribe a un soporte tienda (como la que tienes arriba). El sytax es similar a la de una propiedad abstracta:

public InnerClass InnerClass { get; set; } 

Esto genera automáticamente un miembro privado para su almacenamiento, a continuación, lee de ella en el get y escribe en ella en el set.

2
public InnerClass InnerClass 
    { 
     get 
     { 
      return innerClass; 
     } 
     set 
     { 
      innerClass = value; 
     } 
    } 
0

Depende de cómo debería funcionar la clase interna. La clase de salida que tenga que "dueños" de la clase interna, en cuyo caso:

public InnerClass InnerClass{ 
    get{ return innerClass; } 
    set{ innerClass.CopyFrom(value); /* Pseudo method call */ } 
} 

Al hacerlo de esta manera, se evita que el código fuera de la manipulación de la instancia a menos que explícitamente a través de OuterClass ..

+0

No realmente, ya que estás devolviendo la instancia en el getter. La única forma real de hacerlo (y este enfoque es un poco maloliente ...) sería utilizar el mismo método CopyFrom para devolver una nueva instancia en el getter. –

+0

Creo que has entendido mal. El punto es que puedes modificar la instancia, pero tienes que hacerlo explícitamente a través de la instancia de OuterClass. Ejemplo OuterClass.InnerClass foo = new OuterClass.InnerClass(); foo.M_A = 1; outerInstance.InnerClass = foo; //outerInstance.InnerClass.M_A es igual a 1 foo.SomeProperty = 2; // outerInstance.InnerClass.M_A igual a 1 outerInstance.InnerClass = foo; //outerInstance.InnerClass.M_A es igual a 2 – James

0

Si significa acceder a los miembros de la clase interna sin exponer la clase interna en sí, puede usar el siguiente código. Si solo desea exponer this.innerClass, no hay diferencia en la forma en que expone los campos de InnerClass.

class OuterClass 
{ 
    private InnerClass innerClass 

    public int M_A 
    { 
     get 
     { 
      if (this.innerClass != null) 
      { 
       return this.innerClass.M_A; 
      } 
      else 
      { 
       throw new InvalidOperationException(); 
      } 
     } 
     set 
     { 
      if (this.innerClass != null) 
      { 
       this.innerClass.M_A = value; 
      } 
      else 
      { 
       throw new InvalidOperationException(); 
      } 
     } 
    } 
} 
+0

No estoy seguro de cómo se aplica esto a menos que me haya perdido parte de la pregunta ... ¿es eso lo que estaba pidiendo? –

+0

Simplemente curioso: ¿por qué lanzarías una excepción de operación no válida en el getter? Entiendo por qué harías esto en el setter, pero ¿normalmente no asumirías que el getter es pasivo? – BenAlabaster

+0

Leí la pregunta "[...] getter and setter for the innerClass member of OuterClass?" con una "s" adicional como "miembros [...] innerClassS de OuterClass?", pero regonized eso solo después de terminar mi respuesta. –

21

La forma más elegante de hacer esto es utilizar captadores implícitos y definidores:

class InnerClass 
{ 
    public int a{ get; set; } 
    public int b{ get; set; } 
} 

class OuterClass 
{ 
    public InnerClass innerClass{ get; set; } 
} 

Esto es implícitamente el mismo que:

class InnerClass 
{ 
    private int _a; 
    public int a 
    { 
     get 
     { 
      return _a; 
     } 
     set 
     { 
      _a = value; 
     } 
    } 

    private int _b; 
    public int b 
    { 
     get 
     { 
      return _b; 
     } 
     set 
     { 
      _b = value; 
     } 
    } 
} 

class OuterClass 
{ 
    private InnerClass _innerClass; 
    public InnerClass innerClass 
    { 
     get 
     { 
      return _innerClass; 
     } 
     set 
     { 
      _innerClass = value; 
     } 
    } 
} 

Estas dos definiciones son implícitamente la misma - Menos bastantes pulsaciones de teclas. En el primer ejemplo, el compilador implementará los campos privados necesarios detrás de las escenas para que no tenga que hacerlo. El segundo, sin embargo, le da más control de lo que está sucediendo.

+0

+1 para getters y setters implícitos – BobTheBuilder

+2

... ¿En qué se diferencia esto de mi respuesta? –

+1

Además, no da ninguna indicación de la versión de C#/.NET que está usando. Las propiedades implícitas son solo parte de .NET 3.5/C# 3.0. –

Cuestiones relacionadas