簡體   English   中英

不知道如何從 C# 中聲明為抽象類類型的對象中檢索屬性

[英]Don't kwow how to retrieve properties from objects declared as abstract class type in C#

我正在學習 C# 並且我對在類中使用繼承有疑問,我希望有人可以幫助我。

如果我有一些從抽象類繼承的類,我可以將輔助類的對象聲明為主要抽象類的類型,如下所示:

Animal leopard = new Mammal();

其中Mammal是一個繼承自抽象類Animal類。 在這種情況下,如何訪問專門來自Mammal類的屬性? 查看以下代碼以獲得更好的理解:

        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;
            }
        }

在此示例中,由於所有類都繼承自 Animal 類,因此我可以將它們添加到List<Animal> ,但是當我嘗試訪問 Mammal 類獨有的屬性furColorrunningSpeed ,出現錯誤,因為它們沒有t 屬於 Animal 類。 這些屬性去哪里了? 我怎樣才能找回它們?

此致,

法比亞諾。

您可以將其聲明為Mammal leopard = new Mammal(); 訪問它。 否則,您需要將leopard投回哺乳動物以檢索它們,因為Animal沒有您需要的屬性。

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

這是多態性(多種形式)的一個例子。

使用任何語言,我們都可以斷言以下內容:

  1. 所有哺乳動物都是動物——但並非所有動物都是哺乳動物;
  2. 所有的鳥類都是動物——但並非所有的動物都是鳥類;
  3. 所有的魚都是動物——但並非所有的動物都是魚;

抽象類可以定義為藍圖。

根據定義,藍圖只能用於構建具體對象。

如果對於抽象類來說也是如此 - 是否可以繼承(繼承)用於構建對象 - 可以實例化(初始化)。

這里的多態性可以看作是將派生類 Mammals 分配給抽象類 Animals 的能力——因為 Mammals 可以是 Animals。

哺乳動物類可以有多種形式 - 它可以被視為動物或哺乳動物。

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

鑒於上面的多態性解釋,兩個實例化都是正確的 - 但是Animal leopard將按照其類屬性(封裝) nameanimalClass

同時, Mammal leopard將按照他的類屬性+繼承nameanimalClassfurColorrunningSpeed

您還可以在要訪問派生類的方法時使用 as 運算符。

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

或者更緊湊的語法。

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

使用第二種方式,如果將 leopard 創建為 Fish,則 fur 將為空。 這可能是一個問題,具體取決於您的 furColor 方法在哺乳動物可能沒有毛皮的情況下如何工作。 即沒有毛皮意味着 furColor 為空。 在這種情況下,您可能無法判斷派生類是魚還是沒有毛的哺乳動物。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM