5

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

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.
4

2 回答 2

3

只能通过将lookupVar 转换为extendedLookUpImplementor 或我认为的反射。

于 2013-09-05T11:49:41.453 回答
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# 扩展方法,因为它们可能适合您的场景。

于 2013-09-08T01:38:44.733 回答