【发布时间】:2012-03-26 12:33:44
【问题描述】:
先看这段代码:
class Program
{
static void Main(string[] args)
{
var x =(Base) new Derived();
((IMethod)x).DoWork();
Console.ReadKey();
}
}
interface IMethod
{
void DoWork();
}
abstract class Base : IMethod
{
void IMethod.DoWork()
{
Console.WriteLine("Base.DoWork");
}
}
class Derived : Base, IMethod
{
public void DoWork()
{
//here I where I want to call base.DoWork();
Console.WriteLine("Derived.DoWork");
}
}
输出:
Derived.DoWork
期望:
Base.DoWork
Derived.DoWork
我正在处理一个 API,它公开了一个接口,当实现该接口时,DoWork 方法将在进程的某个部分被调用。
现在在上面的例子中,Base 类是 API 的一部分,它在内部(在 API 中)已经显式地实现了该接口并在 DoWork 方法中执行了一些重要的操作。
我还需要在我的派生类中重写IMethod 的实现,所以我会在需要时收到通知,问题是我不能“重写”该方法并调用基方法,我也不能转换以IMethod为基础。
有什么办法吗?
注意:反射不起作用,因为它是 Silveright 项目,并且禁止调用私有方法。
【问题讨论】:
-
为什么要混合两种接口实现方式?
-
您的基类显然没有考虑到这种继承;通常,如果基类希望允许覆盖行为,则基类将提供一个受保护的虚拟方法来实现显式实现的逻辑。鉴于此,即使您能找到一种方法,“强制”这种覆盖行为也是有风险的,因为您实际上是以原始开发人员未设计的方式从类派生的。也就是说,这仍然是一个有趣的问题。
-
@DanBryant,让我们把设计放在一边(除此之外别无选择),但不要忘记我需要像基类一样实现接口,并且两种方法都必须叫做。请参阅我的更新答案。
-
@DanBryant,实际上你的解决方案就是我要做的,我将在基础中调用一个受保护的虚拟方法并在派生中覆盖它。请张贴作为答案。
标签: c# silverlight inheritance interface implementation