自定义接口实现和接口c#
本文关键字:接口 实现 自定义 | 更新日期: 2023-09-27 18:13:32
我有一个问题,我有两种类型,区别只是在方法的签名上。我的"B计划"是忘记这个区别,我在具体实施中处理它,但对于"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。
我希望我写得清楚。
有可能吗?
谢谢!
不确定我是否准确理解,但试试这个:
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();
因为CCD_ 7将不是CCD_ 8的成员。
只需删除接口A和B实现MyInterface的部分。如果你声明不想使用MyInterface,它有什么意义?
请记住,接口是具体实现的契约,为了使其在架构上有意义,任何和所有实现都应该在逻辑上使用契约中列出的属性和函数。拥有3个界面会给你带来你想要的东西,并且比试图扩展1个更有意义。
不,你不能那样做。返回类型是方法签名的一部分。因此,如果你不实现ICollection MyMethod((,你就没有履行MyInterface定义的契约。为什么不能简单地在AClass中实现返回null的MyMethod?
我觉得你违背了多态性的意义。您希望能够使用接口,并对类进行polimorply调用,但希望返回不同的内容。您计划如何处理收益差异?如果签名不同,您必须在呼叫之前或之后手动调整。
如果您从AClass返回null,那么您可以在调用后进行调整。如果你想返回一个void,那么我宁愿把MyMethod从MyInterface移到B和a,做一个AS a/B转换,在任何一种情况下都可以做任何你需要做的事情。
1(使用抽象类,这样您就可以将特定方法/属性的实现委托给嵌套类:
public abstract class AClass : A
{
public void MyMethod() { ... }
public abstract ICollection<int> MyMethod();
}
2( 或者在不属于A
继承树的另一个接口中提取ICollection<int> MyMethod()