gpt4 book ai didi

c# - 如何在基类上调用显式实现的接口(interface)方法

转载 作者:IT王子 更新时间:2023-10-29 04:13:02 27 4
gpt4 key购买 nike

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

interface I
{
int M();
}

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

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

从派生类的 I.M() 实现中,我想调用基类的实现,但我不知道该怎么做。到目前为止我尝试的是这个(在 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

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


更新:

我知道可以使用派生类调用的“辅助”方法,例如:

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

我也可以更改它以非显式地实现接口(interface)。但我只是想知道如果没有任何这些解决方法是否可行。

最佳答案

很遗憾,这是不可能的。
甚至没有辅助方法。辅助方法与您的第二次尝试存在相同的问题:this 属于 B 类型,即使在基类中也会调用 M 的实现> 在 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(); }
}

唯一的解决方法是 A 中的辅助方法,它用于 AM 实现:

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

,您也需要为 B 提供这样的方法

关于c# - 如何在基类上调用显式实现的接口(interface)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5976216/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com