2010-10-29 65 views
1

我想讓我的類有參數ID來識別這個類。 例如,我想是這樣的:僞靜態虛擬C#機制

class Car 
{ 
    public static virtual string ID{get{return "car";}} 
} 

class SuperCar : Car 
{ 
    public static override string ID{get{return "superCar";}} 
} 

Car a = new Car(); 
//a.ID == car 
a = new SuperCar(); 
//a.ID = superCar 

你覺得有什麼,爲什麼做這樣的事情?我現在我不能讓當前虛擬靜態:/

+0

在您的示例中,您將ID作爲非靜態實例級屬性訪問,我認爲這正是您需要執行的操作,因爲它提供了您正在尋找的多態行爲。我不確定我是否理解你爲什麼要首先將屬性設置爲靜態? – Steven 2010-10-29 17:41:56

回答

2

你可以使用a.GetType().Name;

+0

Thx,它是很好的solutuion,但是我不能讓Car ID「c」和SuperCar「sc」,並且我不能使Car.GetType()。名稱:/ – openglNewbie 2010-10-29 17:23:42

+0

你可以使typeof(Car).Name – 2010-10-29 17:24:57

+0

@openglNewbie,但你可以做'typeof(SuperCar).Name' – 2010-10-29 17:25:27

1

我不知道爲什麼你需要做到這一點時,你可以簡單地參考類型本身。

var car = new SuperCar(); 
if (car is SuperCar) 
{ 
    ... 
} 

,或者如果你需要的實際名稱爲文本

var className = car.GetType().Name; 
7

我可能是密集的,但你寫下來究竟是什麼,如果你沒有使用靜態方法你會得到什麼。您似乎在問「如何讓靜態方法像實例方法一樣行事」。答案是...使用實例方法和正常的多態性?

如果這只是爲了獲得班級的標識符,GetType()成員就足夠了。

0

您可以刪除代碼中的虛擬和覆蓋關鍵字並使用new關鍵字,但我仍然同意tvanfosson。

因此,該屬性不再繼承父類,它是絕對新的。

4

亞當賴特點擊這裏一個好點。靜態屬性不是多態的,但它看起來像被尋求的行爲是多態性。

問題似乎是因爲靜態存在於類級別而不是實例級別,因此您無法利用多態性,因爲您沒有處理可能會覆蓋該行爲的實例。

一些混淆可能來自您的示例代碼看起來像試圖非靜態地處理屬性的事實。當訪問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); 
    } 
} 
1

一個更好的方法是什麼我認爲你正在嘗試做的是使用屬性。

[MyAttribute("Car")] 
public class Car 
{ ... } 

現在,您可以使用反射來查找類中的所有屬性,無論您是對類型還是對其實例的引用。