en C#

2010-08-11 4 views
4

quelle est la différence entreen C#

class abc : qwe 
{ 
} 

et

class zxc : qwe 
{ 
    zxc() : base(new someAnotherclass()). 
    { 
    }  
} 

Répondre

10

La différence est que dans votre premier extrait de code que vous appelez le constructeur de la classe de base parameterless, alors que dans votre deuxième extrait de code que vous appelez le constructeur de la classe de base avec un paramètre.

Votre classe de base peut être définie comme suit:

class qwe{ 
    public qwe(){ /* Some code */ } 

    public qwe(SomeAnotherclass ac){ /* Some other code */ } 
} 

Le constructeur par défaut pour votre classe abc ressemble exactement comme ce qui suit:

class abc{ 
    public abc() : base() {}  
} 
0

La première est une classe de base est qwe. Le second est le même mais il a aussi un constructeur qui exécute un constructeur spécifié (avec des arguments différents puis un par défaut) à partir de la classe de base tout en étant appelé.

Le second extrait montre comment gérer la situation lorsque la classe de base n'a pas de constructeur par défaut. La raison de cette exigence est que le constructeur de classe dérivé appelle toujours le constructeur de la classe de base en premier. Si le constructeur de base a besoin de certains paramètres, vous devez l'appeler explicitement.

0

En ce qui concerne l'héritage, les deux sont les mêmes: zxc is_a qwe

Dans votre deuxième exemple, vous définissez simplement le constructeur zxc vide pour appeler le constructeur qwe avant avec un argument que vous générez (someAnotherclass()). Cela signifie généralement une agrégation si vous conservez la référence quelque part, pas l'héritage.

0

Le résultat sera le même. En appelant le constructeur sur zxc, vous pouvez ajouter une fonctionnalité ET appeler le constructeur de base en appelant le constructeur sur zxc.

0

Dans le deuxième extrait de code, vous êtes chaining le constructeur par défaut (sans paramètre) de l'héritage d'un constructeur de la classe de base qui prend un paramètre someAnotherClass.

Lors de l'initialisation de la classe zxc, cela appelle le constructeur qwe avec le nouveau someAnotherClass.

Avec le premier extrait de code, aucun de ce chaînage de constructeur n'est en cours.

0

probablement vous dire

class abc : qwe 
{ 
} 

et

class zxc : qwe 
{ 
    public zxc() : base(new someAnotherClass()). 
    { 
    }  
} 

Cela signifie que

class qwe 
{ 
    // public constructor accepting SomeAnotherType 
    public qwe(SomeAnotherType someAnotherClass) 
    { 
    } 
} 

Une telle approche est appelée nested constructor call ou constructor chaining