接口继承一致性

本文关键字:一致性 继承 接口 | 更新日期: 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");
  }
}