【问题标题】:Override explicitly implemented interface method in derived class重写派生类中显式实现的接口方法
【发布时间】:2010-06-23 11:55:07
【问题描述】:

我想在基类上显式实现接口方法。

除此之外,我想将此方法设为虚拟,以便在派生类上覆盖它,但显式实现的方法不允许这样做。

我尝试在基类中创建一个受保护的虚拟方法,从接口方法调用它,然后在派生类中覆盖这个方法。这似乎可行,但 FxCop 抱怨规则 CA1033“接口方法应可由子类型调用”。

(我的基类实现了接口,派生类没有。)

我应该如何改进这个(缩写的)代码更正确,或者在这种情况下我应该忽略 FxCop?

在基类中:

protected virtual string ConstructSignal()
{
    return "Base string";
}

#region ISignal Members

string ISignal.GetMessage()
{
    this.ConstructSignal();
}

#endregion

在派生类中:

protected override string ConstructSignal()
{
    return "Derived string";
}

最终决定隐式实现接口方法,这仍然有效并让 FxCop 满意。

【问题讨论】:

  • ...当你的派生类被强制转换为ISignal 并调用GetMessage() 时会发生什么?
  • 我还在学习这些东西 :) 有更好的方法吗?
  • 你真的需要混合显式实现和基类吗?最好的解决方案可能是简化您的模型。
  • 请发布实际产生 CA1033 的代码。

标签: c# winforms interface overriding


【解决方案1】:

将 ConstructSignal() 方法声明移动到某个接口(让我们将其命名为 IConstructSignal)并在派生类中实现它。 以下显式实现将起作用:

string ISignal.GetMessage()
{
    (this as IConstructSignal).ConstructSignal(); // implementation of derived class called
}

【讨论】:

    猜你喜欢
    • 2012-03-14
    • 2023-03-12
    • 2019-01-24
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 2015-11-27
    相关资源
    最近更新 更多