基类中的事件与派生类中接口事件的实现之间的冲突

时间:2013-02-12 03:41:47

标签: .net events inheritance interface conflict

基类:

Public MustInherit Class Connector

    Public Event Changed as EventHandler

End Class

接口:

Public Interface IPlug

    Event Changed as EventHandler

End Interface

派生类:

Public Class OutputConnector
    Inherits Connector
    Implements IPlug

    Event Changed as EventHandler Implements IPlug.Changed

End Class

VB.Net问题:

Changed中的OutputConnector事件当然与Changed中的Connector事件冲突。但我必须实现它以满足IPlug接口。

我该如何解决这个问题?

我还有其他来自Connector(例如InputConnector类)的类,需要有Changed个事件,但是没有实现IPlug。我不希望实现IPlug的派生类有一个额外的事件只是为了避免名称冲突(如果我在基类或接口中更改了事件的名称就是这种情况)

有什么建议吗?

编辑:

问题不在于名称本身,而是我希望派生类以某种方式将其接口事件实现映射到基类中的现有事件 - 而不必在派生类中声明一个额外的事件(所有各种路由杂乱引导);毕竟,事件已经存在于基类中!我需要的是一种让界面知道的方法..

伪解决方案(仅用于说明)将能够使某些东西产生效果

Public Event MyBase.Changed Implements IPlug.Changed

在派生的OutputConnector类中。

1 个答案:

答案 0 :(得分:0)

This question指出了两种使接口实现明确的方法。

  • 将其设为私有
  • 使用实现名称不需要与接口名称匹配的事实。

所以这取决于您打算如何使用IPlug.Changed。如果您始终使用界面进行互动,则可以将其设为私有,即使需要Shadows,也无法通过公共API看到它。

另一种方法是确定声明的新名称,例如OutputConnector.IPlugChanged

您选择的内容取决于您如何使用所有内容。

编辑:

您似乎希望这两个事件的功能相同。

在这种情况下,最好的办法是隐藏IPlug.Changed实现,方法是使用不同的名称将其隐藏起来。

隐藏IPlug.Changed后,请使用OnChange受保护的方法(假设您创建了一个)将两者联系起来,在IPlugChanged被触发时调用OnChange。 / p>

如果您没有OnChange受保护的方法,则可以附加执行上述调用的事件。请注意,如果您担心调用订单事件,则无法工作。

最后一个选项可能是使用Custom语法将对IPlug的更改流式传输到基类。