我们可以使用接口变量调用其接口中未定义的实现类中的方法吗?

时间:2013-09-05 11:48:12

标签: c# oop

是否可以在接口的实现类中调用一个方法,该接口未使用接口变量在接口中定义,如下所示:

interface ILookup {
            public void someInterfaceMethod1();
            public void someInterfaceMethod2();
}

......和实施类:

public class extendedLookUpImplementor: ILookup
{
          //constructor
          LookUpImplementor(){
          }

          public void someInterfaceMethod1(){
           // Implementation Code here.
          }

          public void someInterfaceMethod2(){
           // Implementation Code here.
          }

          public void ExtendedMethod(){
           // Implementation Code here.
          }

}

在客户代码中:

ILookup lookupVar = new LookUpImplementor();
lookupVar -> someInterfaceMethod1(); // i know it will work.
lookupVar -> someInterfaceMethod2(); // i know it will work.

我的问题是,我可以使用lookupVar调用ExtendedMethod,如下所示:

lookupVar -> ExtendedMethod(); // Note again that ExtendedMethod() is not defined in Ilookup interface/contract.

2 个答案:

答案 0 :(得分:3)

只有将lookupVar强制转换为extendedLookUpImplementor,或者通过反射我认为。

答案 1 :(得分:0)

首先,正如Ian1971所说,是的,你可以通过将其转换为特定类型,比如说

ILookup lookupVar = new LookUpImplementor();
((extendedLookUpImplementor)lookupVar).ExtendedMethod(); //this should work

或者使用动态/反射。

话虽如此,我真的不认为这是一个很好的方法,因为它会违反合同/接口的目标之一。

例如,如果我们有ILookup变量“lookupVar”

dynamic lookup = lookupVar;
lookup.ExtendedMethod(); //this would work

在任何时候,使用对象lookupVar的代码都不能保证会有一个方法ExtendedMethod并且可以在运行时抛出异常。

我真正的问题是,为什么要添加一个无法在合同中添加的方法,这里的目标是什么。如果该方法正在扩展该类,请尝试通过C# extension method,因为它们可能适合您的方案。