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

时间:2011-11-05 17:47:39

标签: c# .net

我有一个问题,我有两种类型,区别在于方法的签名。我的'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。

我希望我写清楚。

有可能吗?

谢谢!

5 个答案:

答案 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演员并做任何你需要做的事情。