亞當賴特點擊這裏一個好點。靜態屬性不是多態的,但它看起來像被尋求的行爲是多態性。
問題似乎是因爲靜態存在於類級別而不是實例級別,因此您無法利用多態性,因爲您沒有處理可能會覆蓋該行爲的實例。
一些混淆可能來自您的示例代碼看起來像試圖非靜態地處理屬性的事實。當訪問Car的靜態ID屬性時,該屬性暴露在Car ...不是實例a上。這看起來可能有些不妥,但重要的是要記住,對Car.ID的調用與實例類型a無關。因此,從實例a的創建方式可以得出沒有任何級別的推論;即只是因爲實例恰好是SuperCar,所以無法知道Car.ID的下一個調用實際上應該被解釋爲對SuperCar.ID的調用。
可以模擬polymoprhic這種行爲上的靜態屬性,雖然,通過一個虛擬實例級屬性封裝到相應的靜態屬性的調用...
像這樣的東西可能會給你,你找什麼爲:
class Program
{
class Car
{
// NOTE: this can't have the same name as the static method
public virtual string CarType
{
get { return ID; }
}
public static string ID { get { return "car"; } }
}
class SuperCar : Car
{
// NOTE: this can't have the same name as the static method
public override string CarType
{
get { return ID; }
}
public static string ID { get { return "super car"; } }
}
static void Main(string[] args)
{
Car a = new Car();
Console.WriteLine(a.CarType);
a = new SuperCar();
Console.WriteLine(a.CarType);
}
}
在您的示例中,您將ID作爲非靜態實例級屬性訪問,我認爲這正是您需要執行的操作,因爲它提供了您正在尋找的多態行爲。我不確定我是否理解你爲什麼要首先將屬性設置爲靜態? – Steven 2010-10-29 17:41:56