如何在基类上调用显式实现的接口方法 [英] How to call an explicitly implemented interface-method on the base class

查看:30
本文介绍了如何在基类上调用显式实现的接口方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一种情况,两个类(一个派生自另一个)都显式地实现了相同的接口:

I have a situation, where two classes (one deriving from the other) both implement the same interface explicitly:

interface I
{
  int M();
}

class A : I
{
  int I.M() { return 1; }
}

class B : A, I
{
  int I.M() { return 2; }
}

I.M()的派生类的实现,我想调用基类的实现,但我不知道怎么做.到目前为止我尝试的是这个(在 B 类中):

From the derived class' implementation of I.M(), I'd like to call the implementation of the base class, but I don't see how to do it. What I tried so far is this (in class B):

int I.M() { return (base as I).M() + 2; }
// this gives a compile-time error
//error CS0175: Use of keyword 'base' is not valid in this context

int I.M() { return ((this as A) as I).M() + 2; }
// this results in an endless loop, since it calls B's implementation

有没有办法做到这一点,而不必实现另一个(非接口显式)辅助方法?

Is there a way to do this, without having to implement another (non interface-explicit) helper method?

更新:

我知道可以使用派生类可以调用的帮助程序"方法,例如:

I know it's possible with a "helper" method which can be called by the derived class, e.g:

class A : I
{
    int I.M() { return M2(); }
    protected int M2 { return 1; }
}

我也可以更改它以非显式地实现接口.但我只是想知道如果没有这些变通办法是否有可能.

I can also change it to implement the interface non-explicitly. But I was just wondering if it's possible without any of these workarounds.

推荐答案

不幸的是,这是不可能的.
甚至没有帮助方法.辅助方法与您的第二次尝试存在相同的问题:this 属于 B 类型,即使在基类中也会调用 M 的实现> 在 B 中:

Unfortunately, it isn't possible.
Not even with a helper method. The helper method has the same problems as your second attempt: this is of type B, even in the base class and will call the implementation of M in B:

interface I
{
  int M();
}
class A : I
{
  int I.M() { return 1; }
  protected int CallM() { return (this as I).M(); }
}
class B : A, I
{
  int I.M() { return CallM(); }
}

唯一的解决方法是在 AM 实现中使用的 A 中的辅助方法:

The only workaround would be a helper method in A that is used in A's implementation of M:

interface I
{
  int M();
}
class A : I
{
  int I.M() { return CallM(); }
  protected int CallM() { return 1; }
}
class B : A, I
{
  int I.M() { return CallM(); }
}

但是如果有一个 class C : B, I...

But you would need to provide a method like this also for B if there will be a class C : B, I...

这篇关于如何在基类上调用显式实现的接口方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆