4

为什么这是不可能的?

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通用,而不是它的方法,但由于某种原因它不适合我。

4

5 回答 5

5

这是不可能的,因为这些方法具有不同的签名。A.f是泛型方法而B.f不是(它仅使用类泛型参数)。

你可以看到这个表单调用者视角:

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

B<int> variableB = new B<int>();
variableB.f();
于 2013-01-11T09:10:39.720 回答
4

B不履行合同A

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

例如,假设您有 aB<int>并将其强制转换为 an 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>();
于 2013-01-11T09:12:22.240 回答
1

对于您的代码

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

于 2013-01-11T09:13:48.937 回答
0

可能这就是你打算做的:

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(或某物)在基类中,并且您不能在派生类中更改此限制。

于 2013-01-11T09:12:13.910 回答
0
abstract class A
{
    public abstract T f<T>();
}

class B<T> : A
{
    public override T f<T>()
    {
        return default (T);
    }
}
于 2013-01-11T09:13:49.980 回答