强制显式接口实现

本文关键字:显式接口实现 | 更新日期: 2023-09-27 18:05:49

假设我们有一个接口IFoo:

interface IFoo {
    void DoSomething();
}

现在我们有了一个实现类,在它的构造函数中调用这个方法:

class MyBase : IFoo {
    MyBase() { this.DoSomething(); }
    void DoSomething() { /* ... */ }
}

最后,我们有一个继承MyBase的类,但shell提供了IFoo接口的另一个实现。但是在调试时,我意识到构造函数只访问我理解的MyBase上的实现。我可以使用((IFoo) this).DoSomething();

从构造函数中显式地调用接口方法
class MyDerived : MyBase, IFoo {
    void DoSomething() { /* ... */ }
}

但是我怎样才能强制方法在使用它之前必须被强制转换到该接口呢?我知道我可以显式地在两个类中实现接口,但是谁强迫我这样做呢?因此,我们最终会遇到这样的问题:我如何强制继承我的类的人也显式地实现我的接口?

编辑:另一种方法是在MyBase中使DoSomething虚化,并在实现IFoo时提交派生类。然而,在构造函数中调用虚成员时,我得到了r#警告。

强制显式接口实现

这就是我要做的,将基类中的方法标记为虚拟的,这样它就可以在子类中被重写。子类不需要显式地实现接口,因为它继承了父类的行为。

interface IFoo {
    void DoSomething();
}
class MyBase : IFoo {
    MyBase() { this.DoSomething(); }
    **virtual** void DoSomething() { /* ... */ }
}
class MyDerived : MyBase {
    **override** void DoSomething() { /* ... */ }
}