1
votes

Ne savez pas comment récupérer des propriétés à partir d'objets déclarés comme type de classe abstraite en C #

J'apprends C # et j'ai un doute sur l'utilisation de l'héritage dans les classes et j'aimerais que quelqu'un puisse m'aider.

Si j'ai des classes qui héritent d'une classe abstraite, je peux déclarer un objet de la classe secondaire comme du type de la classe abstraite primaire, comme ceci:

        static void Main(string[] args)
        {
            Animal leopard = new Mammal("leopard", "mammal", "yellow", 80);
            Bird falcon = new Bird("falcon", "bird", "black", 300);
            Fish shark = new Fish("shark", "fish", "white", 80);
            List<Animal> animalList = new List<Animal>();            

            animalList.Add(leopard);
            animalList.Add(falcon);
            animalList.Add(shark);

            Console.WriteLine("Name: {0}, Class: {1}, Fur Collor: {2}, Running Speed: {3} km/h.",
                leopard.name, leopard.animalClass, leopard.furColor, leopard.runningSpeed);
            
            Console.ReadLine();
        }

        public abstract class Animal
        {
            public string name { get; set; }
            public string animalClass { get; set; }
        }

        public class Mammal : Animal
        {
            public string furColor { get; set; }
            public double runningSpeed { get; set; }

            public Mammal(string name, string animalClass,
                string furColor, double runningSpeed)
            {
                this.name = name;
                this.animalClass = animalClass;
                this.furColor = furColor;
                this.runningSpeed = runningSpeed;
            }
        }

        public class Bird : Animal
        {
            public string featherColor { get; set; }
            public double flightSpeed { get; set; }

            public Bird(string nam, string animalClass,
                string featherColor, double flightSpeed)
            {
                this.name = name;
                this.animalClass = animalClass;
                this.featherColor = featherColor;
                this.flightSpeed = flightSpeed;
            }
        }

        public class Fish : Animal
        {
            public string scaleColor { get; set; }
            public double swimmingSpeed { get; set; }

            public Fish(string name, string animalClass,
                string scaleColor, double swimmingSpeed)
            {
                this.name = name;
                this.animalClass = animalClass;
                this.scaleColor = scaleColor;
                this.swimmingSpeed = swimmingSpeed;
            }
        }

Mammal est une classe qui hérite de la classe abstraite Animal . Dans ce cas, comment puis-je accéder aux propriétés qui sont exclusivement de la classe Mammal ? Regardez le code suivant pour une meilleure compréhension:

Animal leopard = new Mammal();

Dans cet exemple, comme toutes les classes héritent de la classe Animal, je pourrais les ajouter à une List<Animal> , mais lorsque j'essaie d'accéder aux propriétés furColor et runningSpeed qui sont exclusives à la classe Mammal, j'ai une erreur car elles ne le font pas. € ™ t appartiennent à la classe animale. Où sont allées ces propriétés? Comment pourrais-je les récupérer?

Meilleures salutations,

Fabiano.


0 commentaires

3 Réponses :


3
votes

Vous pouvez le déclarer comme Mammal leopard = new Mammal(); pour y avoir accès. Sinon, vous devrez renvoyer le leopard sur un mammifère pour le récupérer car Animal n'a pas les propriétés dont vous avez besoin.

    Console.WriteLine("Name: {0}, Class: {1}, Fur Collor: {2}, Running Speed: {3} km/h.",
        leopard.name, leopard.animalClass, ((Mammal)leopard).furColor, ((Mammal)leopard).runningSpeed);


0 commentaires

0
votes

Vous pouvez également utiliser l'opérateur as au point où vous souhaitez accéder à la méthode de la classe dérivée.

Animal leopard = new Mammal();
var fur = (leopard as Mammal)?.furColor();

Ou une syntaxe plus compacte.

Animal leopard = new Mammal();
Mammal mam = leopard as Animal;
if( mam != null)
{ 
    var fur = mam.furColor();
}

En utilisant cette deuxième méthode, si le léopard était créé en tant que poisson, la fourrure serait nulle. Cela peut être un problème selon la façon dont votre méthode furColor est censée fonctionner dans le cas où un mammifère pourrait ne pas avoir de fourrure. Ie no fur signifie que furColor est nul. Dans ce cas, vous ne pourrez peut-être pas dire si la classe dérivée était un poisson ou s'il s'agissait d'un mammifère sans fourrure.


2 commentaires

Cela ne fonctionnera pas. Vous voulez sûrement dire en as Mammal , n'est-ce pas?


@Streamline merci. C'était de l'insouciance de ma part.



1
votes

Ceci est un exemple de polymorphisme (formes multiples).

En utilisant n'importe quel langage, nous pouvons affirmer ce qui suit:

  1. Tous les mammifères sont des animaux - mais tous les animaux ne sont pas des mammifères;
  2. Tous les oiseaux sont des animaux - mais tous les animaux ne sont pas des oiseaux;
  3. Tous les poissons sont des animaux - mais tous les animaux ne sont pas des poissons;

Une classe abstraite peut être définie comme le blue print.

Selon la définition, un modèle ne peut être utilisé que pour construire vos objets en béton.

Il en va de même pour une classe abstraite - doit être héritée (héritage) utilisée pour construire un objet - qui peut être instanciée (initialisée).

Le polymorphisme ici peut être vu comme la capacité d'assigner une classe dérivée Mammifères à la classe abstraite Animaux - puisque les Mammifères peuvent être des Animaux.

Une classe de mammifères peut avoir plusieurs formes - elle peut être considérée comme un animal ou un mammifère.

Animal leopard = new Mammal();
Mammal leopard = new Mammal();

Les deux instanciations sont correctes étant donné l'explication polymorphe ci-dessus - cependant Animal leopard se comportera selon ses propriétés de classe (Encapsulation) name et animalClass .

Pendant ce temps, Mammal leopard se comportera selon ses propriétés de classe + name héritage, animalClass , furColor et runningSpeed .


0 commentaires