初始化繼承類中常量或其他字段的最佳方法是什麼?我意識到這個例子中有很多語法錯誤,但這是解釋我想要做什麼的最好例子。初始化繼承類中的字段
public abstract class Animal {
public abstract const string Name; // #1
public abstract const bool CanFly;
public abstract double Price; // price is not const, because it can be modified
public void Fly() {
if (!CanFly)
Debug.Writeln("{0}s can't fly.", Name);
else
Debug.Writeln("The {0} flew.", Name);
}
}
public class Dog : Animal {
public override const string Name = "Dog"; // #2
public override const bool CanFly = false;
public override double Price = 320.0;
}
public class Bird : Animal {
public override const string Name = "Bird";
public override const bool CanFly = true;
public override double Price = 43.0;
}
有幾件事情,我試圖完成:
- 基類必須分配這3個領域。
- 理想情況下,我希望這些初始化的字段在類的頂部一起,以便我可以看到哪些常量分配給每個類,並在需要時更改它們。
- 字段名稱和CanFly無法更改。
我知道你可以在構造函數中初始化這些字段(如果你擺脫了const),但是不能保證它們被賦值。如果您將這些字段改爲屬性並覆蓋它們,則仍需要初始化屬性的後臺字段。你將如何實現這一點?
它抱怨幾個語法錯誤:
- 修飾語「抽象」是不是在場上纔有效。嘗試使用屬性來代替。 (#1)
- 常量字段要求要提供一個值(#1)
- 修飾符「覆蓋」是不適用於這個項目(#2)
我認爲你誤解了常量。常量是在整個宇宙歷史中永遠不會改變的值;因此,名稱爲「常量」。常量的好例子:十幾個雞蛋的數量,鉛的原子數。不好:你的應用程序的版本號;這隨着時間而改變。可怕的是:每桶石油的價格;每隔幾秒更換一次。如果有一個字段的值在應用程序的生命週期中可能發生變化,那麼它不是一個常量。 – 2010-01-09 01:20:01
感謝您的解釋。我想我有點困惑,因爲Dog.Name和Dog.CanFly字段不應該改變,因此我認爲它們應該是常量。然而,Animal.Name和Animal.CanFly字段將被繼承類改變,所以它們不應該是常量。我試圖將它們定義爲僅在繼承類中的常量,我猜你不能這樣做。 – Senseful 2010-01-09 17:43:40
要對在施工時設置一次並且之後從未更改過的值進行建模,請使用只讀字段。只讀字段可以是實例字段,在這種情況下,每個實例可以有不同的值,或者靜態的,在這種情況下,每個實例共享相同的值。 – 2010-01-09 19:39:15