我有两个接口A,B(驻留在不同的组件中)。两者都声明具有相同签名的方法(MyMethod
)。这两个接口由第三个接口(C)继承。
在前两个接口(A,B)中声明的方法旨在返回相同的值(对于A和B),因此,我不希望在从C派生时显式实现接口。
我通过在第三个界面中声明方法,同时使用new-keyword来实现这一点。
public interface A {
MyType MyMethod();
}
public interface B {
MyType MyMethod();
}
public interface C : A,B{
new MyType MyMethod();
}
public class ImplementingClass : C{
public MyType MyMethod(){
// do somethin
// return something
}
}
这有什么问题可以预料到,还是这种不好的风格?
更新
对不起,我的初步问题没有显示完整的故事。问题出现了,当我尝试在C的接口引用上调用MyMethod时。编译器不会编译它。
C aReferenceToC=new CImplementingClass();
aReferenceToC.MyMethod(); // <<< Here the compiler will throw an exception
完整示例
C myCImplementationAsAnInterfaceReference = new MyCImplementation();
myCImplementationAsAnInterfaceReference.MyMethod(); // This does not compile without declaring MyMethod in C with the new-Keyword
MyCImplementation myCImplementationReference= new MyCImplementation();
myCImplementationReference.MyMethod(); // This however will always compile and run
public interface A {
int MyMethod();
}
public interface B {
int MyMethod();
}
public interface C : A, B {
}
public class MyCImplementation : C {
public int MyMethod() {
return 1;
}
}
答案 0 :(得分:1)
做你做的事,绝不会阻止人们提供A.MyMethod
,B.MyMethod
和C.MyMethod
的不同实现。
class TestABC : C
{
MyType C.MyMethod()
{
// 1
return null;
}
MyType A.MyMethod()
{
// 2
return null;
}
MyType B.MyMethod()
{
// 3
return null;
}
}
new
关键字无论如何都不会删除“隐藏”方法。它只是告诉编译器容忍这样一个事实,即类型现在有两个相同的签名方法,一个从基类继承,一个由当前类型声明。
编辑好的,鉴于问题的发展,我认为你的问题确实存在(我最初并不清楚):
你有这个设计:
public interface A {
MyType MyMethod();
}
public interface B {
MyType MyMethod();
}
public interface C : A,B{
}
您的问题是此代码无法编译:
C myInstance = CreateAnInstanceOfSomeClassImplementingC();
myInstance.MyMethod(); // does not compile, ambiguous
你的问题是,如果摆脱编译器错误是一个很好的解决方案错误CS0121:以下方法或属性之间的调用是不明确的:[...] 引入{{1 } new
中的成员。
C
不能是C
)时。接口无法指示继承的两个方法必须联合起来。
答案 1 :(得分:-1)
是否使用new
关键字并不会真正改变任何内容。行为是一样的。
Testing testing = new Testing();
testing.MyMethod(); // calls Testing.MyMethod
AA testingA = new Testing();
testingA.MyMethod(); // calls AA.MyMethod
public interface A
{
int MyMethod();
}
public class AA : A
{
public int MyMethod()
{
return 11;
}
}
public interface B
{
int MyMethod();
}
public interface C : A, B
{
int MyMethod();
}
public class Testing : AA,C
{
public int MyMethod()
{
return 10;
}
}