繁体   English   中英

C#:使用类泛型参数覆盖泛型方法

[英]C#: Override generic method using class generic parameter

为什么这不可能?

abstract class A
{
    public abstract T f<T>();
}

class B<T> : A
{
    public override T f()
    {
        return default (T);
    }
}

错误:

does not implement inherited abstract member 'A.f<T>()'
no suitable method found to override

我知道签名必须是相同的,但从我的角度来看,我认为没有理由这是不允许的。 另外我知道另一个解决方案是制作A泛型而不是它的方法,但由于某些原因它不适合我。

这是不可能的,因为这些方法具有不同的签名。 Af是泛型方法而Bf不是(它只使用类泛型参数)。

你可以从调用者的角度看这个形式:

A variableA = new A();
variableA.f<int>();

B<int> variableB = new B<int>();
variableB.f();

B不履行A的合同。

A允许使用任何类型参数调用f以返回该类型。 B不允许使用类型参数调用f ,只返回B类型参数的类型。

例如,假设您有一个B<int>并将其强制转换为A (应该可以继承它)。 然后你在它上面调用了f<bool>() (这应该是可能的,因为它是A )。 然后怎样呢? 底层B<int>没有调用方法。

B b = new B<int>();
// This is legal as B inherits from A
A a = b;
// This is a legal call, but how does b handle it?
bool result = a.f<bool>();

在您的代码的情况下

abstract class A
{
    public abstract T f<T>();
}

class B<T> : A
{
    public override T f()
    {
        return default (T);
    }
}

你期望在下面的代码中调用什么?

public void Foo(A myObj) {
    myObj.f<DateTime>();
}
Foo(new B<int>());

虽然类型契约(抽象类A)明确指出您需要实现,但该方法没有实现。 因此,您可以实现或更改合同以在类级别使用类型参数

abstract class A<T>
{
    public abstract T f();
}

class B<T> : A<T>
{
    public override T f()
    {
        return default (T);
    }
}

确实编译,但它当然也限制了f

可能这就是你打算做的事情:

abstract class A
{
    public abstract T f<T>();
}

class B<U> : A
{
    public override T f<T>() //also needs to have a generic type parameter
    {
        throw new NotImplementedException();
    }

    public U f()
    {
        return f<U>();
    }
}

泛型方法类型参数和泛型类类型参数(此处为TU )没有直接连接,即T不限于基类中的U (或其他),并且您不能在派生类中更改此限制。

abstract class A
{
    public abstract T f<T>();
}

class B<T> : A
{
    public override T f<T>()
    {
        return default (T);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM