【发布时间】:2013-11-10 01:20:21
【问题描述】:
今天我正在重构一个我创建的库,并在多个平台(WPF、WF、WP7、WP8)之间共享代码。
我的想法是我使用继承来扩展类中的功能。顶级类向客户端公开几个事件,该事件在一个方法中引发,该方法使用接受一些参数的构造函数向下传递给基类。
对象基本上是作为单例使用的。
例子:
public class SomeHandler : BaseHandler
{
public event EventHandler<Custom1EventArgs> RequestCompleted = delegate {};
public event EventHandler<Custom2EventArgs> ActionHandled = delegate { };
protected SomeHandler()
: base(new CustomUtil(), new CustomRepository(),
new AnotherRepository(ADelegateMethod),
AnotherDelegateMethod, AnotherOneDelegateMethod) {}
#region [ Singleton ]
public static SomeHandler Instance
{ get { return Nested.instance;} }
class Nested
{
internal static readonly SomeHandler instance = new SomeHandler ();
}
#endregion
private static void ADelegateMethod(Custom1EventArgs args)
{
Instance.RequestCompleted (Instance, args);
}
private static void AnotherDelegateMethod(
Custom2EventArgs args, CustomObject result)
{
// Do stuff....
AnotherCustomObject cusObj = new AnotherCustomObject(args);
Instance.ActionHandled (Instance, cusObj);
}
private static void AnotherOneDelegateMethod(CustomObject result)
{
// Do some stuff...
}
}
好的,如果你注意到了,我需要将委托方法标记为静态,因为注入发生在构造函数参数中。但这迫使我将事件设为静态。作为解决方法,我依赖于用户总是使用我的对象的 Instance 单例实例这一事实,尽管可以根据需要初始化对象,但 sealed 目前不是一个选项,因为它也用作基础在特定的特殊实现中继承类到另一个类。
将事件更改为静态是不是很糟糕?我觉得不太合适,你怎么看? 这样的设计还能改进吗?
实际上,我使用委托作为代码的一部分,需要在特定时间从其他对象new AnotherRepository(ADelegateMethod) 或BaseHandler 类执行,因此我基本上可以为客户提供信息。
【问题讨论】:
-
不确定我是否理解正确,但整个“代表”厨房让我想起了虚拟方法调用,但只是以非常奇怪和真正精致的方式。 he he 不是吗? (如果不是,那有什么区别?)(还有为什么你需要一个单例?)
-
与虚方法无关。虚拟方法将提供一个实现,子类也可以覆盖它或实现和调用基本实现。我发送一个委托(方法)以在运行时的特定点从父类或另一个类调用。我有理由希望用户只使用我的模块的一个实例。
-
好吧,我只是说这些委托看起来像虚拟方法(按逻辑概念)。它们仍然是私有的,因此它们只能由父级调用,但虚拟方法应该是这样工作的(!)您不必在父级中定义方法主体 - 您可以将它们标记为抽象。 (你无论如何都应该覆盖它们)。但是如果你把它留空(基本的类方法体)——不需要在孩子身上做任何事情(包括把一些东西传递给父母)。如果我错过了什么,请告诉我。
-
好的,现在你是对的,不使用虚拟方法而是抽象我可以删除委托,在子类中实现方法并在我需要的父类中调用它们,这确实可以让我免于 2 3 位代表,谢谢,从未想过此功能。这将修复 2 个委托,如果传递给另一个在基类中用作属性的类会发生什么情况?你怎么看?
-
旁注:我已经对您的代码进行了格式化以删除太多空格...(我同意 Agat 的观点,即强制派生类传递委托而不是实现虚拟方法或使用正常事件很奇怪。 .. 此外,您已经发现设计很奇怪,因为您不能在构造函数中将实例方法作为委托传递...)
标签: c# oop dependency-injection delegates design-principles