Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 基类中的事件与派生类中接口事件的实现之间的冲突_.net_Events_Inheritance_Interface_Conflict - Fatal编程技术网

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

.net 基类中的事件与派生类中接口事件的实现之间的冲突,.net,events,inheritance,interface,conflict,.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

基类:

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问题:

当然,OutputConnector中的更改事件与Connector中的更改事件冲突。但是我必须实现它来满足IPlug接口

我怎样才能解决这个问题

我还有从连接器派生的其他类,例如需要更改事件的InputConnector类,但不实现IPlug。我不希望实现IPlug的派生类有额外的事件,只是为了避免名称冲突,如果我在基类或接口中更改了事件的名称,就会出现这种情况

有什么建议吗

编辑:

问题不在于名称本身,而是我希望派生类以某种方式将其接口事件实现映射到基类中的现有事件,而不必在派生类中声明一个附加事件,并使用各种各样的路由混乱来引导;毕竟,该事件已经存在于基类中!我需要的是让接口知道

一个仅用于说明的伪解决方案将能够使某些东西产生

Public Event MyBase.Changed Implements IPlug.Changed
在派生的OutputConnector类中。

指出了使接口实现显式的两种方法

保密 使用实现的名称不必与接口名称匹配这一事实。 因此,这取决于您计划如何使用IPlug.Changed。如果您总是使用该接口进行交互,那么您可以简单地将其设置为私有,即使它需要阴影,也无法通过公共API看到

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

您选择哪一个取决于您如何使用所有内容

编辑:

您似乎希望这两个事件在功能上相同

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

一旦隐藏了IPlug.change,请使用OnChange保护的方法,假设您创建了一个方法来链接这两个方法,并在触发OnChange时调用IPlugChanged

如果没有OnChange保护的方法,可以附加一个执行上述调用的事件。请注意,如果您担心调用订单事件,那么这将不起作用


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

我已经编辑了您的标题。请看,如果共识是否定的,他们就不应该这样做。这些都不能解决我的问题。问题不在于名字本身,但是,我希望派生类中的接口实现将事件实现归因于基类中的事件,而不必在派生类中声明额外的事件—该事件已经存在于基类中—我需要一种方法让接口知道这一点。@d7samurai:我添加了一些解决方法的示例,但需要注意的是,由于OutputConnector实现了IPlug,它负责实现,因此无法遵从父级,尽管VB.Net理论上可以提供易于使用的语法。尽管我会质疑,如果您完全控制这两个定义,那么实现这两个定义的基本接口是否可以工作,比如IChangeable。事实上,它们应该是同一个事件,我不必在派生类中声明任何内容,而是能够将现有的基类事件映射到派生类中的接口实现。我最不想要的是一个额外的事件-私人或非。换句话说,声明一个专门针对IPlug实现的事件及其带来的混乱是不可能的。这比使用阴影更难看..我在我的例子中简化了。更改的事件属于一个大类层次结构的公共祖先,树上有几个父类。换句话说,将已更改的事件向下移动一个级别(即不在连接器中声明它,而是直接在派生类中单独声明它)不是一个选项。我想我现在会坚持使用阴影,直到VB介绍了一种本地实现的方法..啊。现在我明白你的意思了。。如果我调暗c as Connector=New OutputConnector,则永远不会引发c.Changed,因为这与实际OutputConnector内部引发的阴影事件不同。因此,在连接更改的事件处理程序之前,我必须将c强制转换为OutputConnector。但如果事件支持可重写/重写,则这不会是问题。正当无论如何,在昨晚我在欧洲交流之后,我修改了架构以彻底消除这个问题。谢谢你的意见。