C# 强制显式接口实现

C# 强制显式接口实现,c#,inheritance,interface,C#,Inheritance,Interface,假设我们有一个接口IFoo: interface IFoo { void DoSomething(); } 现在我们有一个实现类,它在构造函数中调用此方法: class MyBase : IFoo { MyBase() { this.DoSomething(); } void DoSomething() { /* ... */ } } 最后,我们有一个类继承了MyBase,但是shell提供了接口IFoo的另一个实现。但在调试时,我意识到构造函数只访问MyBase

假设我们有一个接口
IFoo

interface IFoo {
    void DoSomething();
}
现在我们有一个实现类,它在构造函数中调用此方法:

class MyBase : IFoo {

    MyBase() { this.DoSomething(); }

    void DoSomething() { /* ... */ }
}
最后,我们有一个类继承了
MyBase
,但是shell提供了接口
IFoo
的另一个实现。但在调试时,我意识到构造函数只访问
MyBase
上的implementation,我理解这一点。要获得接口的正确实现,我可以使用
((IFoo)this.DoSomething()从构造函数中显式调用接口方法

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


编辑:另一种方法是在
MyBase
中使
DoSomething
虚拟化,并将ommit作为实现
IFoo
的派生类。然而,我在调用构造函数中的虚拟成员时收到R#-警告

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

interface IFoo {
    void DoSomething();
}

class MyBase : IFoo {

    MyBase() { this.DoSomething(); }

    **virtual** void DoSomething() { /* ... */ }
}

class MyDerived : MyBase {
    **override** void DoSomething() { /* ... */ }
}

你能不能也给我看一下儿童班的代码?有必要让MyBase具体化还是抽象化?你不能让这个方法虚拟化吗?具体一点。从基类的构造函数调用
virtual
方法本身并没有什么错误。当您重写该方法时,问题就出现了。重写方法是在尚未调用其构造函数的类型中定义的,因此调用该方法可能不安全,这正是ReSharper警告您的。同样的问题也适用于通过接口显式调用显式实现的方法,只是ReSharper没有检测到这种情况。不,不会,但这并不意味着这是安全的。如果在执行子类型的构造函数之前编写一个可以安全地在该子类型中调用的虚拟方法,那么也可以通过接口安全地调用显式实现的方法。如果编写虚拟方法时调用它还不安全,那么通过接口调用此类方法也不安全。您应该记录将从基本构造函数调用该方法,以指示它必须以静默方式失败或成功运行,即使后代类型的构造函数还没有执行。我也考虑过这一点,请参阅我的编辑。然而,R#在那上面印了一条警告。也许我可以在我的场景中忽略它。@HimBromBeere请原谅我的无知,但什么是R#?R#警告很有用,但R#不是编译器。此代码是安全的,并且编码方式正确。您正在更改子类中方法的行为,这是OOP的一部分。您知道MyDerivate类的隐式构造函数将调用MyBase的构造函数(base()方法调用隐式地作为MyDerivate类的构造函数的第一行),就是这样。@FranciscoGoldenstein感谢您指出OOP的要点。Resharper警告的出现是有原因的。在构造函数内调用虚拟方法通常是不安全的。在其他继承类初始化之前,可以调用已初始化(或通过一个子构造函数注入)的参数。这是一个糟糕的设计,也是它显示为警告的原因之一。即使您知道您的实现没有做到这一点,如果有人继承了该类,他仍然可能违反该类,因此该代码的语句是安全的,正确的方法是完全错误的
interface IFoo {
    void DoSomething();
}

class MyBase : IFoo {

    MyBase() { this.DoSomething(); }

    **virtual** void DoSomething() { /* ... */ }
}

class MyDerived : MyBase {
    **override** void DoSomething() { /* ... */ }
}