[英]Override the property of an abstract class
我想輸出Tiger1實例的numberOfLegs
。 但是輸出是0,而不是我的預期4。我的錯誤在哪里? 請幫助老虎使他的腿恢復原狀。
using System;
namespace AbstractProperty
{
class MainClass
{
static void Main(string[] args)
{
Tiger tiger1 = new Tiger();
int result = tiger1.NumberOfLegs;
Console.WriteLine(result);
Console.Read();
}
public abstract class Animal
{
public abstract int NumberOfLegs { get; set; }
}
public class Tiger : Animal
{
private int numberOfLegs;
public override int NumberOfLegs
{
get
{
return numberOfLegs;
}
set
{
numberOfLegs = 4;
}
}
}
}
}
編輯:我認為在二傳手中使用numberOfLegs = 4
不好
不會調用NumberOfLegs屬性設置器,因為您沒有在代碼中的任何地方更改值。 默認情況下,int值為零。 您可以執行以下操作之一:
numberOfLegs
變量的默認值: private int numberOfLegs = 4;
numberOfLegs
值: public class Tiger : Animal { private int numberOfLegs; public Tiger() { numberOfLegs = 4; } // ... }
你做錯了一切...
不要為numberOfLegs
提供設置器。 只需提供一個吸氣劑。 然后在構造函數中設置支路數,或者直接設置字段,如下所示:
public abstract class Animal
{
public abstract int NumberOfLegs { get; }
}
public class Tiger : Animal
{
private int numberOfLegs = 4;
public override int NumberOfLegs
{
get
{
return numberOfLegs;
}
}
}
您的代碼無法正常工作的原因是,您沒有調用Tiger.NumberOfLegs
的setter,但是,如果這樣做,您當然會意識到它是多么的錯誤:
Tiger tiger1 = new Tiger();
tiger1.NumberOfLegs = 100;
int result = tiger1.NumberOfLegs; // Set to 100, but now it's 4! Urk.
如我所見,從未調用NumberOfLegs
的set
訪問器,因此numberOfLegs
的默認值為0。
您可以編寫一個構造函數,並為NumberOfLegs
分配一些值,因為在set
訪問器中已對4進行了硬編碼,因此無論如何都將分配4,即,如果您這樣編寫構造函數:
public Tiger() {
NumberOfLegs = 10;
}
將調用set
訪問器,並將4
(而不是10
)分配給numberOfLegs
。 也許您在這里混淆了一些概念:)
編輯1:如果您現在知道在setter中分配硬編碼值不是那么好,並且您不想在setter中做任何特殊的事情,最好對屬性使用傳統方法:
private int numberOfLegs;
public override int NumberOfLegs
{
get
{
return numberOfLegs;
}
set
{
numberOfLegs = value;
}
}
或者簡單地
public override int NumberOfLegs { get; set; }
與上述相同。
並將值分配給構造函數中的NumberOfLegs
:
public Tiger()
{
NumberOfLegs = 4;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.