如何在内部调用显式接口实现方法而不进行显式转换?

Jad*_*ias 41 .net c#

如果我有

public class AImplementation:IAInterface
{
   void IAInterface.AInterfaceMethod()
   {
   }

   void AnotherMethod()
   {
      ((IAInterface)this).AInterfaceMethod();
   }
}
Run Code Online (Sandbox Code Playgroud)

如何AInterfaceMethod()AnotherMethod()没有明确的投射来打电话?

Eri*_*ert 69

一些答案说你做不到.他们是不正确的.如果不使用强制转换运算符,有很多方法可以做到这一点.

技术#1:使用"as"运算符而不是强制运算符.

void AnotherMethod()   
{      
    (this as IAInterface).AInterfaceMethod();  // no cast here
}
Run Code Online (Sandbox Code Playgroud)

技术#2:通过局部变量使用隐式转换.

void AnotherMethod()   
{      
    IAInterface ia = this;
    ia.AInterfaceMethod();  // no cast here either
}
Run Code Online (Sandbox Code Playgroud)

技巧#3:编写扩展方法:

static class Extensions
{
    public static void DoIt(this IAInterface ia)
    {
        ia.AInterfaceMethod(); // no cast here!
    }
}
...
void AnotherMethod()   
{      
    this.DoIt();  // no cast here either!
}
Run Code Online (Sandbox Code Playgroud)

技巧#4:介绍帮手:

private IAInterface AsIA => this;
void AnotherMethod()   
{      
    this.AsIA.IAInterfaceMethod();  // no casts here!
}
Run Code Online (Sandbox Code Playgroud)

  • 为了迂腐,他没有要求不使用"演员",他要求"没有明确的演员",而且我认为,一般来说,算子`as`会被认为是"明确的演员"(不知道是否这在语言规范定义方面是正确的,或者在该背景下该问题是否毫无意义). (10认同)
  • 我知道这已经很老了,但我今天偶然发现了这个问题.我是否认为"最佳"方式是隐含的方式?这为代码提供了最佳的编译时保护我是否正确?如果我使用强制转换或"as"操作(在这种情况下实际上没有任何意义,因为对象应该首先实现接口)我冒着尝试转换为无效接口的风险运行时错误.如果我尝试隐式转换为该类未实现的接口,我会得到一个编译时错误,并且要好得多. (7认同)
  • @ zverev.Eugene:如果类'A`*的作者打算*派生类必须能够调用和/或覆盖基类实现那么类'A`的作者应该创建一个受保护的虚方法而不是一个显式接口方法.如果类'A`的作者不打算这样,并且类'B`的作者希望类'A`的作者已经这样做那么类'B`的作者应该(1)找到不同的类或者通过自己写作来扩展,或者(2)与"A"类的作者进行谈判.**继承必须是类**的设计特征. (6认同)
  • 嗯,强制转换运算符的语义和as运算符的语义是完全不同的,因此将它们混淆是一个逻辑错误.有关详细信息,请参见http://beta.blogs.msdn.com/ericlippert/archive/2009/10/08/what-s-the-difference-between-as-and-cast-operators.aspx. (2认同)
  • @julealgon:你提出了一个令人信服的论点。 (2认同)

Pav*_*aev 9

您可以介绍一个帮助私有财产:

private IAInterface IAInterface => this;

void IAInterface.AInterfaceMethod()
{
}

void AnotherMethod()
{
   IAInterface.AInterfaceMethod();
}
Run Code Online (Sandbox Code Playgroud)


jos*_*rry 8

试过这个,它的工作原理......

public class AImplementation : IAInterface
{
    IAInterface IAInterface;

    public AImplementation() {
        IAInterface = (IAInterface)this;
    }

    void IAInterface.AInterfaceMethod()
    {
    }

    void AnotherMethod()
    {
       IAInterface.AInterfaceMethod();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您不必显式地将其转换为 IAInterface (2认同)