2017-02-26 2 views
0

je crée une classe nommée MyMainClassComment puis-je transmettre une valeur d'une sous-classe à une autre sous-classe dans une classe principale C#?

namespace MyTest 
{ 
     private void frmMain_Load(object sender, EventArgs e) 
     { 
      MyMainClass myVar = new MyMainClass(); 

      myVar.sub1.sb1A = "value 1A"; 
      myVar.sub1.sb1B = "value 1B"; 

      MessageBox.Show(myVar.sub2.wantPassString); 
      //I want to print the value "I've got value value 1A" 
     }    
    public class MyMainClass 
    { 
     public subClass1 sub1 = new subClass1(); 
     public subClass2 sub2 = new subClass2(); 

     public class subClass1 
     { 
      public string sb1A{get;set;} 
      public string sb1B{get;set;} 
     } 
     public class subClass2 
     { 
      public string sb2A{get;set;} 
      public string sb2B{get;set;} 
      // a1a is a value that I want to get from subClass1 
      string a1a = subClass1.sb1A; 

      public string wantPassString {get{return "I've got value " + a1a;}} 
     } 
    } 
} 

Comment puis-je passer la valeur de subClass1.sb1A à la chaîne A1A ou wantPassString à subClass2? quand je l'appelle à frmMain_Load

+0

Vous savez que 'subClass1' et' subClass2' ne sont pas des sous-classes? – Enigmativity

+0

Alors, que devrais-je appelé subClass1 et subClass2 dans mon application, je pensais que MyMainClass couvrirait ces 2 donc je l'ai appelé subClass. Sinon merci. –

+0

Une sous-classe est quand vous avez 'classe A {}' & 'classe B: A {}' - dans ce cas la classe 'B' est une sous-classe de' A'. Dans votre cas, ils ne sont que des objets et vous pouvez les appeler «X» et «Y» si vous voulez, mais pas quelque chose qui prête à confusion. – Enigmativity

Répondre

1

L'approche normale serait de passer la classe par le constructeur. Cela fonctionne:

public class MyMainClass 
{ 
    public MyMainClass() 
    { 
     sub1 = new subClass1(); 
     sub2 = new subClass2(sub1); 
    } 
    public subClass1 sub1; 
    public subClass2 sub2; 

    public class subClass1 
    { 
     public string sb1A{get;set;} 
     public string sb1B{get;set;} 
    } 
    public class subClass2 
    { 
     public subClass2(subClass1 sub1) 
     { 
      this.sub1 = sub1; 
     } 
     public string sb2A{get;set;} 
     public string sb2B{get;set;} 
     subClass1 sub1; 

     public string wantPassString {get{return "I've got value " + sub1.sb1A;}} 
    } 
} 
+0

J'essaie votre méthode, mais lorsqu'il est exécuté, il passe null à l'a1a –

+0

@MonySnap - Oui, désolé. J'ai changé le code. Cela devrait fonctionner maintenant. – Enigmativity

+0

Merci beaucoup c'est vraiment du travail. –

0

Une option est de créer la méthode au lieu de la propriété comme

 public string wantPassString(string param) 
    { 
     return "I've got value " + param; 
    } 

et frmMain_Load appeler cette méthode

MessageBox.Show(myVar.sub2.wantPassString(a1a)); 
+0

J'ai utilisé votre méthode pour obtenir la valeur de subclass1 mais je veux compléter le code dans subClass2. Quand je l'utilise dans frmLoad je veux appeler comme myVar.sub2.wantPassString –

0

Créer une troisième classe pour contenir les données.

public MainClass 
{ 
    private class sharedClass 
    { 
     internal string sb1A { get; set; } 
    } 

    public class subClass1 
    { 

     private readonly sharedClass _shared; 
     internal subClass1(sharedClass shared) 
     { 
      this._shared = shared; 
     } 

     public string sb1A 
     { 
      get 
      { 
       return this._shared.sb1A; 
      } 
      set 
      { 
       this._shared.sb1A = value; 
      } 

     public string sb1B{get;set;} 
    } 

    public class subClass2 
    { 
     private readonly sharedClass _shared; 
     public subClass2(shared s) 
     { 
      _shared = s; 
     } 
     public string sb2A{get;set;} 
     public string sb2B{get;set;} 


     public string wantPassString {get{return "I've got value " + _shared.sb1;}} 
    } 

    private readonly sharedClass _shared = new sharedClass(); 
    private readonly subClass1 _subClass1; 
    private readonly subClass2 _subClass2; 

    public MainClass() 
    { 
     this._subClass1 = new subClass1(this._shared); 
     this._subClass2 = new subClass2(this._shared); 
    } 
} 
+0

Merci, je vais essayer le vôtre. –

+0

Quelque chose ne va pas dans le code et j'ai une erreur dans le code. –

0

Vous pouvez ajouter des propriétés supplémentaires et la méthode et le transmettre comme paramètre:

public string sb2C{ get; set; } 
     public string getData(string strParam) 
     { 
      return sb2C= strParam; 
     } 

ensuite sur votre frmMain_Load:

MessageBox.Show(myVar.sub2.getData(myVar.sub1.sb1B)); 
//This would also populate sb2C that will hold the data from the other class 
+0

Je veux le code Fait dans subClass2 donc quand j'appelle frmMain_Load seulement myVar.sub2.wantPassString je peux obtenir la valeur que je veux. –