2016-10-01 19 views
2

をキャストタイプIは、次の質問(と私は与えられた答えと同じようにそれを解決するだろう)読み: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

私はそれをexpliciteを追加するときにタイプを知ってはいけませんか? –

+0

@KevinWallisコンパイラは 'derived'を' derived'型として扱っていません。それは 'BaseClass'が2つの抽象型 'T'パラメータを持つ' Function'を宣言する方法なので、 'derived'と呼ばれる*ジェネリック型パラメータ*です。 –

+0

答えをありがとう! –

関連する問題