2

我阅读了以下问题(我会以与给定答案相同的方式解决它):将派生类型作为参数传递给抽象类

但是为什么它无法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;
}
4

1 回答 1

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; }
}
于 2016-10-01T12:20:49.130 回答