2016-10-01 125 views
2

我讀了以下問題(我會解決這個問題的相同的方式給出答案):Passing derived type as argument to abstract class泛型方法和類型轉換

但爲什麼不能找到派生類中的value屬性?即使我添加一個類型轉換是不可能的:

public abstract class baseClass 
{ 
    public abstract float function<T>(T a, T b) where T:baseClass; 
} 

public class derived: baseClass 
{ 
    public override float function<derived>(derived a, derived b) 
    { 
     // Here value is not found 
     return a.value + b.value; 
    } 

    public float value; 
} 

實例與類型轉換也沒有工作(和建議冗餘類型轉換所示):

public abstract class baseClass 
{ 
    public abstract float function<T>(T a, T b) where T:baseClass; 
} 

public class derived: baseClass 
{ 
    public override float function<derived>(derived a, derived b) 
    { 
     // Here value is not found even with type cast 
     return ((derived)a).value + ((derived)b).value; 
    } 

    public float value; 
} 
+0

實例與類型轉換工作 - 它的命名問題。將泛型類型參數重命名爲'T',然後可以轉換爲'derived'。 – 2kay

+0

@ 2kay感謝提示 –

回答

2

因爲你聲明該方法的泛型類型參數。編譯器不明白這應該是derived類型。它只知道你已經引入了一個新的泛型類型參數。

你想要什麼叫做F-bound polymorphism,其中類型參數是實現類,遞歸定義的:

public abstract class BaseClass<T> where T : BaseClass<T> 
{ 
    public abstract float Function(T a, T b); 
} 

public class Derived : BaseClass<Derived> 
{ 
    public override float Function(Derived a, Derived b) 
    { 
     return a.Value + b.Value; 
    } 

    public float Value { get; set; } 
} 
+0

但是,當我添加它時,它不應該知道它的類型嗎? –

+0

@KevinWallis編譯器不會將'derived'視爲您創建的'derived'類型。從它的角度來看,它是一個*泛型類型參數*,稱爲'derived',因爲'BaseClass'是如何聲明'Function'的,具有兩個抽象類型'T'參數。 –

+0

好的,謝謝你的回答! –