我有几个派生自基类的类
public interface IBase {}
public class Base : IBase {}
public class ClassA : Base, IBase {}
public class ClassB : Base, IBase {}
public class ClassC : Base, IBase {}
现在我想通过事件处理程序将每个类的实例发送到一个公共位置,所以我想"很好......我只是从{{1}继承Base
并将我的每个实例传递给一个可以将其发送出去的常用方法。 (请注意,以下内容不是真正的代码)
EventArgs
除了public interface IBase : IEventArgs
public class Base : EventArgs, IBase {}
public class ClassA : Base, IBase {}
public class ClassB : Base, IBase {}
public class ClassC : Base, IBase {}
EventHandler Update;
void SendClass(IEventArgs data)
{
Update?.Invoke(this,data);
}
..
SendClass(new ClassA());
SendClass(new ClassB());
SendClass(new ClassC());
显然是我想象中的一个虚构。所以这不可能做到。
看起来唯一有效的解决方案是为我要发送的每个类定义一个海关IEventArgs
方法。 EG:
Send
虽然这有效,但它给我一个糟糕的代码味道感觉,因为我基本上重复了一个非常简单的方法。
是否有其他设计可以通过假想的void SendClassA(ClassA data)
{
Update?.Invoke(this,data);
}
void SendClassB(ClassB data)
{
Update?.Invoke(this,data);
}
void SendClassC(ClassC data)
{
Update?.Invoke(this,data);
}
实现我想要的效果?
我可以用一堆向上和向下投射来达到我想要的效果,但这也让我有一种不好的感觉(见Casting vs using the 'as' keyword in the CLR)
答案 0 :(得分:0)
这是你要找的吗?
public class BaseEventArgs : EventArgs {
public IBase Data;
}
public event EventHandler<BaseEventArgs> Update;
void SendData(IBase data)
{
Update?.Invoke(this, new BaseEventArgs { Data = data } );
}
答案 1 :(得分:0)
你可能想要这样的东西:
void Main()
{
SendClass(new ClassA());
SendClass(new ClassB());
SendClass(new ClassC());
}
public class Base { }
public class ClassA : Base { }
public class ClassB : Base { }
public class ClassC : Base { }
public delegate void SendClassHandler(Base data);
public event SendClassHandler Update;
public void SendClass(Base data)
{
Update?.Invoke(data);
}