我已经架构了一些这样的代码:Scala的继承最佳实践
A“HandlerArguments”类,将采取在一堆工厂,需要对所有的处理程序子类其他佣工:
class HandlerArguments(
val a: A,
val b: B,
val c: C) {
/* nothing here */
}
一个处理器的超类将在HandlerArguments:
class Handler(val args: HandlerArguments) {
def subHandler1 = new SubHandler1(args)
def subHandler2 = new SubHandler2(args)
def subHandler3 = new SubHandler3(args)
var message: Message = null
/* code here that invokes subHandler1, 2, or 3 based on a matcher */
def invokeCommand(msg: Message) = {
message = msg
someCommand match {
case command1 => subHandler1.something()
case command2 => subHandler2.something()
case command3 => subHandler3.something()
}
}
}
而且subHandlers,或子类:
class subHandler1(args: HandlerArguments) extends Handler(args) {
...
args.something.somethingElse(message.x)
...
}
class subHandler2(args: HandlerArguments) extends Handler(args) { ... }
class subHandler3(args: HandlerArguments) extends Handler(args) { ... }
而在另一个文件中,我初始化处理程序:
/* initializing Handler */
val args = new HandlerArguments(a, b, c)
val handler = new Handler(args)
handler.invokeCommand(someMsg)
我的问题是,
这是做到这一点的最好方法是什么?我想实现的主要目的不是在超类Handler和子类之间传递'message'(即subHandler1.something(message))。
我如何使用HandlerArguments?我想过使用特征或抽象类,但这是需要设置一次然后由Handler类使用的。
看起来很奇怪,我把从处理程序到子处理程序的参数传递给扩展子句中的处理程序。有一个更好的方法吗?
想法?谢谢!
谢谢你非常透彻的答案!然而,其中一个要点是我想要传递给messageHandlers的消息和messageHandlers本身之间的关系更紧密。实际上,这个消息实际上是一个类的实例,我宁愿只住在一个地方,所有的messageHandlers都可以访问,因此上面的超类/子类实现。这个新的实现可能吗? – jnfr 2014-09-29 04:47:40
当然,这是可能的。在MessageDispatcher初始化的所有MessageHandlers之间可以有某种共享容器。该容器可以作为构造函数参数传递给MessageHandlers(可以是'Option [Command]'或'MessageBox(Command)')。如果需要的话,这甚至会允许线程安全。当然有多种方式可以做到这一点。我可以举一个例子。 – 2014-09-29 04:56:50
如果它作为构造函数参数传递给每个MessageHandlers,那么这不是消息与处理程序的1:1映射吗?除非我误解实现...一个例子将不胜感激:)谢谢! – jnfr 2014-09-29 05:08:48