接口继承一致性
本文关键字:一致性 继承 接口 | 更新日期: 2023-09-27 18:27:23
首先看一下这个代码:
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
。
有什么解决方案吗?
注意:反射不起作用,因为它是Silveight项目,并且禁止调用私有方法。
您是否能够只编写类,而不是使用继承?然后,您可以随心所欲地实现DoWork()
,并且仍然在Base
对象上调用DoWork()
。由于Base
是抽象的,所以您需要派生一个伪类型来使所有内容都工作。
class Derived : IMethod
{
private class SneakyBase : Base
{
// abstract implementations here
}
private IMethod baseObject = new SneakyBase();
void DoWork()
{
baseObject.DoWork();
// Custom DoWork code here
}
}
这样做显然有点痛苦,但API设计者在显式接口实现方面做出了一个奇怪的选择,现在你要为此付出代价
您正在寻找:
public class Derived : Base
{
public override void DoWork()
{
base.DoWork();
}
}
我发现DanBryant的评论就是答案,尽管正如他所提到的,这有点冒险,因为我们不能保证实现者会调用基本方法,但这是一种不错的方法。
我制作了一个受保护的虚拟方法,它是从私有接口实现器调用的,然后,在派生类中,我不必担心接口,我只关心重写基类并从中调用基类实现,这非常完美,例如:
abstract class Base : IMethod
{
void IMethod.DoWork()
{
DoWork();
}
protected virtual void DoWork()
{
Console.WriteLine("Base.DoWork");
}
}
class Derived : Base
{
protected override void DoWork()
{
base.DoWork();
//here I where I want to call base.DoWork();
Console.WriteLine("Derived.DoWork");
}
}