J'essaye de créer une classe d'héritage square qui dépend de la classe de base polygon. Malheureusement, ma classe d'héritage a une erreur.

C'est ma classe polygon:

class Polygon
{
    public int Numberofsides { get; set; }=0
    public Polygon(int numberofsides)
    {
        Numberofsides = numberofsides;
    }
}

Et voici ma classe Square:

class Square : Polygon
{
    public float Size { get; set; }
    public Square (float size)
    {
        Size = size;
        Numberofsides = 4;
    }
}

Ma classe Square a cette erreur

il n'y a pas d'argument donné correspondant au paramètre formel requis 'numberofsides' de 'Polygon.Polygon (int)'

Je ne comprends pas et je ne sais pas comment le résoudre.

-1
Vũ Đức Dũng 26 janv. 2017 à 18:15

4 réponses

Meilleure réponse

La réponse de Jonesopolis est la solution pour corriger votre erreur.

Cependant, vous ne devez pas utiliser l'héritage de cette manière. C'est le problème classique de: "Rectangle doit-il hériter de Square ou Square doit-il hériter de Recangle" La réponse n'est ni l'un ni l'autre. (Ceci est par exemple discuté ici: https://softwareengineering.stackexchange.com/questions/238176/why-would-square-inheriting-from-rectangle-be-problematic-if-we-override-the-set)

C'est la même chose ici. Votre Square ne doit pas hériter de Polygon. Parce que si quelqu'un obtient un objet (instance de classe) de type Polygon, il ne peut pas s'attendre à une restriction à Square. Cela viole le principe de substitution de Liskov:

La substituabilité est un principe de la programmation orientée objet stipulant que, dans un programme informatique, si S est un sous-type de T, alors les objets de type T peuvent être remplacés par des objets de type S (c'est-à-dire qu'un objet de type T peut être remplacé par objet d'un sous-type S) sans altérer aucune des propriétés souhaitables de T (exactitude, tâche effectuée, etc.).

https://en.wikipedia.org/wiki/Liskov_substitution_principle

1
Community 13 avril 2017 à 12:45

Il semble que le problème soit que votre classe de base, Polygon, n'a pas de constructeur sans paramètre. Vous devez donc appeler le constructeur de la classe de base avec les paramètres du constructeur de la classe dérivée.

class Polygon
{
    public int Numberofsides { get; set; }
    public Polygon()
    {
        Numberofsides = 0;
    }
    public Polygon(int numberofsides)
    {
        Numberofsides = numberofsides;
    }
}
class Square : Polygon
{
    public float Size { get; set; }
    public Square (float size)
    {
        Size = size;
        Numberofsides = 4;
    }
}

Maintenant, votre classe Polygon a un constructeur par défaut qui n'accepte aucun paramètre. De cette façon, lorsque vous en héritez dans la classe Square, il est initialement défini sur 0 afin que vous puissiez le modifier en 4 dans le constructeur de la classe Square.

1
parameter 27 janv. 2017 à 18:14

Il n'y a pas de constructeur de base (ou sans paramètre) dans la classe "Polygon" qui puisse contenir le paramètre "float" du constructeur dérivé.

Résoudre:

  • Définir un constructeur paramétré sans paramètre ou flottant dans Polygon

Ou

  • pour une solution factice, essayez de convertir en int comme ci-dessus

    public Square (taille flottante): base (taille (int))

1
rca 26 janv. 2017 à 15:25

Votre carré hérite de Polygon, mais Polygon n'a qu'un seul constructeur (je suppose) et vous devez pouvoir l'appeler à chaque fois que vous créez un Square:

public Square (float size) : base(4)
{
    Size = size;
    //Numberofsides = 4;
}

Ensuite, vous pouvez exclure l'affectation à NumberOfSides dans Square, car cela vous sera déjà donné via le constructeur pour Polygon

4
Jonesopolis 26 janv. 2017 à 15:20