我有一个问题,我有两种类型,区别在于方法的签名。我的'Plan-B'是忘记这种差异,我在具体实施中处理它,但对于'Plan-A',我想要以下内容:
public interface MyInterface
{
int property;
void MyMethod();
ICollection<int> MyMethod();
}
public interface A : MyInterface
{
void MyMethod();
}
public class AClass : A
{
public void MyMethod() { ... }
}
public interface B : MyInterface
{
ICollection<int> MyMethod();
}
public class BClass : B
{
public ICollection<int> MyMethod() { ... }
}
所以我希望AClass必须实现A中的方法,而不必从MyInterface实现ICollection MyMethod。
我希望我写清楚。
有可能吗?
谢谢!
答案 0 :(得分:3)
不确定我是否准确理解,但请尝试以下方法:
public interface MyInterface
{
int property;
}
public interface A : MyInterface
{
void MyMethod();
}
public class AClass : A
{
public void MyMethod() { ... }
int property;
}
public interface B : MyInterface
{
ICollection<int> MyMethod();
}
public class BClass : B
{
public ICollection<int> MyMethod() { ... }
int property;
}
换句话说,接口A
将方法void MyMethod()
添加到接口MyInterface
,接口B
将方法ICollection<int> MyMethod()
添加到接口MyInterface
}。
请注意,您仍然无法拨打电话。
MyInterface object = new AClass();
object.MyMethod();
由于MyMethod()
不是MyInterface
的成员。
答案 1 :(得分:0)
只需删除接口A和B实现MyInterface的部分。如果你声明你不想使用它,MyInterface有什么意义呢?
答案 2 :(得分:0)
1)使用抽象类,因此您可以将特定方法/属性的实现委托给嵌套类:
public abstract class AClass : A
{
public void MyMethod() { ... }
public abstract ICollection<int> MyMethod();
}
2)或者在另一个不属于ICollection<int> MyMethod()
继承树的接口中提取A
答案 3 :(得分:0)
请记住,接口是具体实现的契约,并且为了在架构上有意义,任何和所有实现都应该在逻辑上使用合同中概述的属性和函数。拥有3个界面将为您提供您所寻找的内容,并且比尝试延伸1更有意义。
答案 4 :(得分:0)
不,你不能这样做。返回类型是方法签名的一部分。因此,如果您没有实现ICollection MyMethod(),则表示您没有完成MyInterface定义的合同。为什么不能简单地在AClass中实现MyMethod作为返回null?
我觉得你反对的是多态性。您希望能够使用该接口,并在类上调用polimorphically,但您希望它返回不同的东西。您打算如何处理回报的差异?如果签名不同,您必须在通话之前或之后手动调整。
如果从AClass返回null,则可以在调用后进行调整。如果你想返回一个空格,那么我宁愿将MyMethod从MyInterface中移到B和A,并做一个AS A / B演员并做任何你需要做的事情。