说我上课了:
abstract class A<T> {
public abstract void foo(T a);
}
class B : A<int> {
public void foo(int a) { //ERROR, signature is not correct
}
在这种情况下如何实现基类?参数的类型应为int。
答案 0 :(得分:6)
正如其他人所指出的那样,你缺少覆盖关键字。
但是,我想提醒您对这种模式要非常小心。如果你不小心,你可以让自己进入一个受伤的世界:
class B<T>
{
public virtual void M(T t) {}
public virtual void M(int x) {}
}
class D : B<int>
{
public override void M(int x) {}
}
它覆盖了哪一个?
这种情况没有任何好处。 CLR规范建议您永远不要陷入两种方法签名在通用构造下统一的情况。好的建议,那就是。
答案 1 :(得分:4)
您错过了override
关键字:
class B : A<int> {
public override void foo(int a) {
}
如果没有override
,编译器需要不同的签名,期望您声明重载。
答案 2 :(得分:1)
您需要使用override
关键字:
public override void foo(int a) {;}
答案 3 :(得分:0)
abstract class N<T>
{
public abstract void foo(T a);
}
class B : N<int>
{
public override void foo(int a)
{
}
}