问题
Base class:
Public MustInherit Class Connector
Public Event Changed as EventHandler
End Class
Interface:
Public Interface IPlug
Event Changed as EventHandler
End Interface
Derived class:
Public Class OutputConnector
Inherits Connector
Implements IPlug
Event Changed as EventHandler Implements IPlug.Changed
End Class
VB.Net Problem:
The Changed
event in OutputConnector
conflicts with the Changed
event in Connector
, of course. But I have to implement it to satisfy the IPlug
interface.
How can I solve this?
I have other classes deriving from Connector
(e.g. an InputConnector
class) that need to have the Changed
event, but NOT implement IPlug
. And I don't want derived classes that are implementing IPlug
to have an additional event just to avoid the name conflict (which would be the case if I changed the name of the event in either the base class or the interface).
Any suggestions?
Edit:
The problem is not the names per se, but that I want the derived class to somehow map its interface event implementation to the existing event in the base class - and not have to declare an additional event in the derived class (with all sorts of routing clutter to boot); after all, the event already exists in the base class! What I need is a way to let the interface know that..
A pseudo-solution (just to illustrate) would be to be able to put something to the effect of
Public Event MyBase.Changed Implements IPlug.Changed
in the derived OutputConnector
class.
回答1:
This question points out two ways to make an interface implementation explicit.
- Make it private
- Use the fact that the name of the implementation need not match the interface name.
So it depends on how you plan on using IPlug.Changed
. If you will always be using the interface to interact, then you can simply make it private, and even if it requires Shadows
it won't be visible via the public API.
The other way is to decide a new name for the declaration, such as OutputConnector.IPlugChanged
.
Which you select depends on how you are using everything.
EDIT:
You seem to want the two events to be identical in functionality.
In that case the best thing to do would be to hide the IPlug.Changed
implementation by making it private with a different name.
Once you have hidden IPlug.Changed
, use your OnChange
protected method (assuming you made one) to link up the two, calling IPlugChanged
when OnChange
is triggered.
If you don't have an OnChange
protected method, you can attach an event that performs the above call instead. Note that if you are worried about the order events are called in, this won't work.
A final option may be to use the Custom syntax to stream changes to IPlug
to the base class.
来源:https://stackoverflow.com/questions/14825021/conflict-between-event-in-base-class-and-implementation-of-interface-event-in-de