12

我有一个简单的 c# 问题(所以我相信)。我是该语言的初学者,我遇到了有关实现它们的接口和类的问题。问题是

我有界面iA

interface iA
{
  bool method1
  bool method2
  bool method3
}

和3 个实现接口的类: classBCD

class B : iA
{
  public bool method1
  public bool method2
  public bool method3
}

如果 B 类有另一个不在接口中的方法,假设method4()我有以下内容:

iA element = new B();

然后我会使用:

element.method4();

我会收到一条错误消息,说我没有method4()第一个参数 type iA

问题是:我可以拥有一个接口类型的对象并用一个类进行实例化,并让该对象从该类调用一个方法,一个不在接口中的方法吗?

我想出的一个解决方案是在接口和派生类之间使用一个抽象类,但是 IMO 会使接口超出范围。在我的设计中,我只想使用接口和派生类。

4

3 回答 3

4

是的,这是可能的。您只需要将接口类型转换为类类型,如下所示:

iA element = new B();
((B)element).method4();

正如 wudzik 所建议的,您应该检查 elemnt 的类型是否正确:

if(element is B)
{
    ((B)element).method4();
}
于 2013-07-29T07:31:30.237 回答
2

您必须将接口类型转换为类类型;通常我们通过as来做到这一点:

  B b = element as B; // <- try cast element as B

  if (!Object.RefernceEquals(null, b)) { // <- element is B or can be legaly interpreted as B
    b.method4(); 
  }

"as" 的优点是只有一次转换操作,而 "is" 和 (B) 必须进行两次转换。

于 2013-07-29T08:05:00.953 回答
2

没有铸造你可以做到这一点。

interface iA
{
  bool method1();
  bool method2();
  bool method3();
}

interface IFoo : iA
{
  bool method4();
}

class B : IFoo
{
  public bool method1() {}
  public bool method2() {}
  public bool method3() {}
  public bool method4() {}
}

IFoo element = new B();    
element.method4();

注意:尝试I对 C# 接口使用大写前缀。

于 2013-07-29T07:42:44.737 回答