2009-05-11 11 views
13

Angenommen, wir haben eine Klasse InnerClass mit Attributen und Getter/Setter. Wir haben auch eine Klasse OuterClass, die die InnerClass enthält.Getter und Setter für Klasse in Klasse C#

z.B.

Wie würde ich ein korrektes Getter und Setter für das innere Member von OuterClass implementieren?

Vielen Dank im Voraus!

+0

"set" sollte sein {m_a = value;} –

+0

Sie haben den Rep zu beheben, dass Sie wissen;) – annakata

Antwort

24

Die Syntax würde nicht anders sein. Nur ...

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

By the way, wenn Sie C# in .NET 3.5 verwenden, können Sie die automatische Eigenschaft Generation Funktion verwenden, wenn alles, was Sie haben eine einfache Eigenschaft, die gerade liest und schreibt auf einen Träger Laden Sie (wie Sie oben haben). Die sytax ist ähnlich dem eines abstrakten Eigenschaft:

public InnerClass InnerClass { get; set; } 

Dies erzeugt automatisch ein eigenes Element für die Lagerung, dann von ihm liest im get und schreibt es in der set.

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

Es hängt davon ab, wie die innere Klasse funktionieren soll. Die äußere Klasse müssen möglicherweise auf „eigene“ die innere Klasse, in diesem Fall:

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

Durch es auf diese Weise tun, Sie außerhalb Code verhindern, dass die Instanz zu manipulieren, sofern nicht ausdrücklich durch OuterClass ..

+0

Nicht wirklich, da Sie die Instanz im Getter zurückgeben. Der einzige wirkliche Weg, dies zu tun (und dieser Ansatz ist ein wenig stinkend ...), wäre, die gleiche CopyFrom-Methode zu verwenden, um eine neue Instanz im Getter zurückzugeben. –

+0

Ich glaube, du hast es falsch verstanden. Der Punkt ist, dass Sie die Instanz ändern können, aber Sie müssen es explizit durch die Instanz von OuterClass tun. Beispiel OuterClass.InnerClass foo = new OuterClass.InnerClass(); foo.M_A = 1; outerInstance.InnerClass = foo; //outerInstance.InnerClass.M_A entspricht 1 foo.SomeProperty = 2; // outerInstance.InnerClass.M_A ist immer noch 1 outdoorInstance.InnerClass = foo; //outerInstance.InnerClass.M_A ist gleich 2 – James

0

Wenn Sie bedeutet, auf innere Klassenmitglieder zuzugreifen, ohne die innere Klasse selbst zu offenbaren. Sie können den folgenden Code verwenden. Wenn Sie nur this.innerClass aussetzen möchten, gibt es keinen Unterschied zu der Art, wie Sie die Felder InnerClass verfügbar machen.

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

Ich bin nicht sicher, wie dies zutrifft, es sei denn, ich habe einen Teil der Frage verpasst ... ist das, wonach er gefragt hat? –

+0

Nur neugierig - warum würden Sie eine ungültige Operation Ausnahme auf den Getter werfen? Ich verstehe, warum du das im Setter machst, aber würdest du normalerweise nicht davon ausgehen, dass der Getter passiv ist? – BenAlabaster

+0

Ich lese die Frage "[...] Getter und Setter für das innere Mitglied der OuterClass?" mit einem zusätzlichen "s" als "[...] innerClass members von OuterClass?", aber erst nachdem ich meine Antwort beendet habe. –

21

Der eleganteste Weg, dies zu tun, ist impliziten Getter und Setter zu verwenden:

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

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

Dies ist implizit das gleiche wie:

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; 
     } 
    } 
} 

Diese beiden Definitionen implizit gleich sind - minus ein paar Tastenanschläge. Im ersten Beispiel implementiert der Compiler die erforderlichen privaten Felder hinter den Kulissen, so dass Sie dies nicht tun müssen. Die zweite gibt Ihnen jedoch mehr Kontrolle über das, was vor sich geht.

+0

+1 für implizite Getter und Setter – BobTheBuilder

+2

... Wie unterscheidet sich das von meiner Antwort? –

+1

Außerdem gibt er keinen Hinweis auf die Version von C# /. NET, die er verwendet. Implizite Eigenschaften sind nur Teil von .NET 3.5/C# 3.0. –