2012-12-07 3 views
1

Pourquoi this n'accepte pas un paramètre de type classe? Que puis-je lire à ce sujet? Voici mon code inutileC# initialisation d'un constructeur en utilisant:

using System; 

public class Class1 
{ 
    public int a = 5; 
} 

public class Class2 
{ 
    private readonly int num; 
    Class1 obj2 = new Class1(); 
    public Class2(Class1 obj) 
    { 
    num = obj.a; 
    } 
    public Class2(string l) : this (Class1 obj2) 
    { 

    } 
} 
+1

Je pense que vous vouliez dire 'publique Classe2 (string l): ce (obj2)' – V4Vendetta

Répondre

3

Votre constructeur prend une instance de Class1, vous devez donc utiliser:

public Class2(string l) : this (new Class1()) 
{ 
} 

Vous voudrez probablement aussi affecter l'argument du constructeur à votre membre obj2 au lieu de créer un nouveau:

public class Class2 
{ 
    private readonly int num; 
    Class1 obj2; 
    public Class2(Class1 obj) 
    { 
     this.obj2 = obj; 
     num = obj.a; 
    } 
    public Class2(string l) : this (new Class1()) { } 
} 
+0

Lee pouvez-vous me dire ce que je peux lire à ce sujet? quel est le nom du sujet, comment demander le google? –

+0

@ user1884807 - Appeler un constructeur d'un autre est appelé 'constructeur chaînage' je crois. – Lee

+0

encore confus cependant (new Class1()) cette instance est sans référence si je comprends bien, je ne savais pas que l'instance pouvait être sans référence, n'est ce pas quand GC apparaît? –

2

Tout d'abord, regardons:

public Class2(string l) : this (Class1 obj2) {...} 

Tout d'abord, vous ne pas inclure le type dans une invocation, il serait donc:

public Class2(string l) : this (obj2) {...} 

Mais: obj2n'est pas valide à ce moment: le constructeur (qui comprend un peu le initialiseur sur le terrain n'a pas encore fonctionné, donc les champs sur this (tels que this.obj) ne sont pas légaux à cet endroit. comme le note Lee: il suffit de passer dans une instance null ou new.

+0

pourquoi je n'ai pas besoin d'indiquer le type d'invocation ici? c'est vrai seulement pour: ces paramètres? –

+0

@ user1884807 C'est la même chose que n'importe quel appel de méthode: vous n'appelez pas 'int i = Math.Min (int 1, int 3)' - vous appelez 'int i = Math.Min (1,3)' –

0

Une classe peut hériter d'une autre classe. Le mot-clé this fait référence à une instance d'une classe et les instances n'existent pas à « développer temps »

0

Vous ne pouvez pas utiliser cette string et de passer à un autre contructor qui prend Class1 comme argument. Vous devez créer un objet Class1. Mais puisque cela a besoin d'un int je n'utiliserais pas un constructeur qui prend string mais . Sinon, vous devrez utiliser int.Parse qui pourrait lancer une excption et les constructeurs exceptionnels ne sont pas une bonne pratique (quand ils pourraient être évités).

public Class2(int i) 
    : this(new Class1() { a=i }) 
{ 

}