不在接口中的类方法

时间:2013-07-29 07:29:55

标签: c# methods interface

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

我有界面iA

interface iA
{
  bool method1
  bool method2
  bool method3
}

和3个实现接口的类:class BCD

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

如果B类有另一个不在界面中的方法,那就说method4()我有以下内容:

iA element = new B();

然后我会用:

element.method4();

我会收到一条错误消息,说我没有method4()接受类型为iA的第一个参数。

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

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

3 个答案:

答案 0 :(得分:4)

是的,这是可能的。您只需要将Interface类型转换为类类型:

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

根据wudzik的建议,你应该检查elemnt是否属于正确的类型:

if(element is B)
{
    ((B)element).method4();
}

答案 1 :(得分: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();

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

答案 2 :(得分: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”的优点是只有一个强制转换操作,而“是”和(B)必须进行两个强制转换。