[英]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 類獨有的屬性furColor
和runningSpeed
,出現錯誤,因為它們沒有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);
這是多態性(多種形式)的一個例子。
使用任何語言,我們都可以斷言以下內容:
抽象類可以定義為藍圖。
根據定義,藍圖只能用於構建具體對象。
如果對於抽象類來說也是如此 - 是否可以繼承(繼承)用於構建對象 - 可以實例化(初始化)。
這里的多態性可以看作是將派生類 Mammals 分配給抽象類 Animals 的能力——因為 Mammals 可以是 Animals。
哺乳動物類可以有多種形式 - 它可以被視為動物或哺乳動物。
Animal leopard = new Mammal();
Mammal leopard = new Mammal();
鑒於上面的多態性解釋,兩個實例化都是正確的 - 但是Animal leopard
將按照其類屬性(封裝) name
和animalClass
。
同時, Mammal leopard
將按照他的類屬性+繼承name
、 animalClass
、 furColor
和runningSpeed
。
您還可以在要訪問派生類的方法時使用 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.