自定义接口实现和接口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。

我希望我写得清楚。

有可能吗?

谢谢!

自定义接口实现和接口c#

不确定我是否准确理解,但试试这个:

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()