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

本文关键字:接口 定义 方法 可以使 变量 调用 实现 我们 | 更新日期: 2023-09-27 18:30:13

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

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.

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

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

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

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

或者可替换地使用动态/反射。

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

例如,如果我们有ILookup变量"lookupVar"

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

在任何时间点,使用对象lookupVar的代码都不能保证会有一个方法ExtendedMethod,并且可以在运行时引发Exception。

我想问你的真正问题是,你为什么要添加一个不能在合同中添加的方法,你的目标是什么。如果该方法正在扩展类,请尝试使用C#扩展方法,因为它们可能适合您的场景。