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

好的,谢谢你的回答! –