为什么这不可能?
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
通用,而不是它的方法,但由于某些原因它不适合我。
答案 0 :(得分:5)
这是不可能的,因为这些方法具有不同的签名。 A.f
是通用方法,B.f
不是(它只使用类通用参数)。
你可以看到这个形式的来电者观点:
A variableA = new A();
variableA.f<int>();
B<int> variableB = new B<int>();
variableB.f();
答案 1 :(得分:4)
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>();
答案 2 :(得分: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
答案 3 :(得分: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>();
}
}
泛型方法类型参数和泛型类类型参数(此处为T
和U
)没有直接连接,即T
不限于U
(在基类中,您不能在派生类中更改此限制。
答案 4 :(得分:0)
abstract class A
{
public abstract T f<T>();
}
class B<T> : A
{
public override T f<T>()
{
return default (T);
}
}