0
votes

Comment puis-je utiliser la variable de classe dérivée? La variable de classe de base est utilisée automatiquement

Je hérite de la plante de classe et de l'animal du royaume de classe et de la classe Mammalia de la classe animal.

J'ai créé des variables booléennes voler, du lait et des fruits dans toutes les classes qui sont attribuées différemment selon des classes. P>

Il existe des méthodes de royaume qui vérifient la volée, le lait et les fruits et donnent une sortie en conséquence. Les méthodes sont héritées par toutes les classes. P>

Mais lorsque j'utilise l'objet de l'usine et de Mammalia à utiliser les méthodes héritées, la variable de classe du Royaume est utilisée à la place de la variable de classe prévue. P>

Le code est un peu long. Donc, excuses. P>

class Kingdom
{
    private bool milk, wings, fruits;

    public Kingdom() : this(true, true, true) {}
    public Kingdom(bool m, bool w, bool f)
    {
        milk = m;
        wings = w;
        fruits = f;
    }

    public virtual string me()
    {
        return "Kingdom Member";
    }

    public virtual void Fly()
    {
        if(this.wings)
        {
            Console.WriteLine(me() + " may Fly.");
        }
        else
        {
            Console.WriteLine(me() + " can not Fly.");
        }
    }

    public virtual void Fruit()
    {
        if(this.fruits)
        {
            Console.WriteLine(me() + " may bear Fruits.");
        }
        else
        {
            Console.WriteLine(me() + " can not bear Fruits.");
        }
    }

    public virtual void Milk()
    {
        if(this.milk)
        {
            Console.WriteLine(me() + " may produce milk.");
        }
        else
        {
            Console.WriteLine(me() + " can not produce milk.");
        }
    }
}

class Plant : Kingdom
{
    private bool milk, wings, fruits;

    public Plant()
    {
        milk = false;
        wings = false;
        fruits = true;
    }

    public override string me()
    {
        return "Plants";
    }
}

class Animelia : Kingdom
{
    private bool milk, wings, fruits;

    public Animelia()
    {
        milk = true;
        wings = true;
        fruits = false;
    }

    public override string me()
    {
        return "Animals";
    }
}

class Mamalia : Animelia
{
    private bool milk, wings, fruits;

    public Mamalia()
    {
        milk = true;
        wings = false;
        fruits = false;
    }

    public override string me()
    {
        return "Mamals";
    }
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!\nLets learn Basic Kingdoms.\n");

        Kingdom p1 = new Plant();
        Kingdom m1 = new Mamalia();

        p1.Fly();
        p1.Milk();
        p1.Fruit();
        Console.WriteLine();
        m1.Fly();
        m1.Milk();
        m1.Fruit();
    }
}


0 commentaires

3 Réponses :


1
votes

Veuillez supprimer le lait code>, wings code>, fruits code> champs de chaque sous-classe. Ils sont déjà hérités em>. Vous les déclarez à nouveau, qui cache celles dans la classe code> royaume code>.

Fondamentalement, cela signifie que les champs que vous définissez ici ... p>

class Plant : Kingdom
{

    public Plant()
    {
        milk = false;
        wings = false;
        fruits = true;
    }

    public override string me()
    {
        return "Plants";
    }
}

class Animelia : Kingdom
{
    public Animelia()
    {
        milk = true;
        wings = true;
        fruits = false;
    }

    public override string me()
    {
        return "Animals";
    }
}

class Mamalia : Animelia
{
    public Mamalia()
    {
        milk = true;
        wings = false;
        fruits = false;
    }

    public override string me()
    {
        return "Mamals";
    }
}


0 commentaires

1
votes

Vous n'avez pas besoin de définir le lait , wings et fruit de variables dans vos classes dérivées car elles existent déjà dans la classe de base .

Pour définir ces variables des classes dérivées, vous avez déjà un constructeur qui est capable de le faire ici: xxx

Tout ce que vous avez à faire est d'utiliser ce constructeur de Votre classe de base en utilisant le mot-clé . Par exemple: xxx


0 commentaires

1
votes

Les méthodes de la mouche (), du lait () et des fruits () sont exécutées dans le contexte de la classe Base Royaume, et ils accèdent aux variables de la classe privée locale dans cette classe.

Le problème est que le royaume la classe n'a pas d'accès direct aux versions ré-définies des variables dans les sous-classes, pourquoi vous obtenez des erreurs qu'elles ne sont pas utilisées. P>

Comme d'autres ont dit, idéalement, vous ne seriez pas réellement -Define les variables de chaque classe enfant, mais gagnez plutôt les variables en royaume "protégées" plutôt que "privées". Vous seriez alors en mesure de définir directement ces variables dans le constructeur de chaque sous-classe. Cependant, pour répondre à votre question de pourquoi em> vous obtenez des avertissements que les variables de chaque sous-classe ne sont pas utilisées, veuillez lire sur ... P>

Un moyen de résoudre ce problème est de Ajoutez des méthodes d'accessoir d'obtention virtuelles dans la classe du Royaume qui peut ensuite être remplacée dans les sous-classes afin de lire les versions ré-définies locales des variables. P>

Veuillez noter: j'ai utilisé l'expression Lamda " Méthodes corsées "Syntaxe ici car il fabrique les méthodes Getwings (), GetMilk () et GetFruit () Nice et Compact. Vous pouvez élargir ces méthodes corsées si vous préférez. P>

Hello World!
Lets learn Basic Kingdoms.

Plants can not Fly.
Plants can not produce milk.
Plants may bear Fruits.

Mamals can not Fly.
Mamals may produce milk.
Mamals can not bear Fruits.


0 commentaires