悬赏分:20 浏览:618 次
public interface BaseClass
{
string testA();
}
public class ClassA : BaseClass
{
public string testA()
{
return "testA";
}
}
public interface BaseTest
{
BaseClass test();
}
public class TestA : BaseTest
{
public ClassA test()
{
return null;
}
}
这样为什么编译通不过。。
|
'ClassLibrary1.TestA' does not implement interface member 'ClassLibrary1.BaseTest.test()'. 'ClassLibrary1.TestA.test()' cannot implement 'ClassLibrary1.BaseTest.test()' because it does not have the matching return type of 'ClassLibrary1.BaseClass'.
返回类型不匹配.
TestA.test() 只能返回声明为 public BaseClass test() 才行.
或者,也可以使用范型:
public interface BaseTest<T>
where T: BaseClass
{
T test();
}
public class TestA : BaseTest<ClassA>
{
ClassA BaseTest<ClassA>.test()
{
return null;
}
}
这是面向对象中Override的基本规则。子类Override父类方法时,签名必须严格一致(包括:函数名,参数类型,返回类型) 楼上给出了两个解决方案。 ×修改子类签名,以符合上面的原则。 (但是,子类中使用ClassA比较难受) ×修改父类签名,使用泛型。从而使子类可以继承特定类型。(但是可能TestA类型和TestB类型没有一个共同的基类,复用性不好) 还有一个解决方案,使用interface的显示实现。如下: public class TestA : BaseTest { public ClassA test() { return null; } BaseClass BaseTest.test() { return test(); } } 哈哈,如果是我,我认为比较完美的解决方案如下: public interface ITest { BaseClass test(); } public class BaseTest<T> : ITest where T : BaseClass { BaseClass ITest.test() { return this.test(); } public virtual T test() { return default(T); } } public class TestA : BaseTest<ClassA> {} public class TestB : BaseTest<ClassB> {} 你在接口 BaseTest 里声明的是接口BaseClass 而在实现接口BaseTest 的TestA 中给出的是ClassA ClassA只是一个实现了接口BaseClass的类,就好比我声明了要食物,你却只给土豆,那么我要其他食物的时候你就没办法了 |