2012-06-06 4 views
0

Je me demandais simplement si ce code était correct et je l'ai trouvé dans certaines informations. La chose que je trouve étrange, c'est que le diamètre est utilisé deux fois dans les deux exemples, est-ce vraiment correct?A propos de l'héritage et des constructeurs

public Ellipse(double diameter): base(diameter, diameter) 
+0

Pourquoi trouvez-vous cela étrange? Quelle est la classe de base? – leppie

+0

Vraisemblablement, il est juste dit "une ellipse par défaut est un cercle" - Je suppose qu'il existe un second constructeur qui prend deux paramètres. –

+0

Pourquoi downvote ma requête? Je pensais juste qu'il était étrange qu'il y ait deux 'diamètre' et je pensais à des champs communs qui ne peuvent pas être deux du même nom, mais maintenant quand je vois ton code, il le comprend mieux et c'est Ok d'avoir un 'diamètre' deux fois. –

Répondre

2

La syntaxe est correcte. Les classes pourraient ressembler à quelque chose comme ça:

public class Base 
{ 
    public Base(double d1, double d2) 
    { 
    } 
} 

public Eclipse : Base 
{ 
    public Ellipse(double diameter) 
     : base(diameter, diameter) 
    { 
    } 
} 
2

C'est le constructeur d'une classe Ellipse, il appelle le constructeur de la classe de base qui a deux paramètres.

Il pourrait ressembler à ceci:

class Shape 
{ 
public Shape(double diameter1, double diameter2) 
{ 
} 
} 
class Ellipse : Shape 
{ 
public Ellipse(double diameter) : base(diameter, diameter) 
{ 
} 
} 

Si vous new Ellipse(10); 10 est passé dans le constructeur Ellipse, qui appelle le constructeur de la classe Shape et passe 10 que les arguments en faveur de ces deux params.

1

Cela dépend de ce que fait le constructeur de la classe de base avec les paramètres, mais syntaxiquement, c'est correct.

Le code que vous avez publié appelle le constructeur de la classe de base qui correspond aux arguments fournis au lieu du constructeur de la classe de base par défaut (le cas échéant).

1

Ceci est le chaînage du constructeur, c'est-à-dire l'appel du constructeur de base avant le constructeur enfant.

Si la classe de base a un constructeur comme

public Base(double, double) 

alors il est parfaitement bien.