是否可以将视图实现隐藏在 Scala 应用程序中?
Is it possible to have the view implementation hidden in a Scala application?
我的目标是在模拟应用程序中使用 MVC 模式,其中控制器知道有一个视图(并使用接口与其交互)但不知道它是如何实现的:
object Controller extends App {
View.initView()
...
}
object View {
stage: Stage = ...
def initView: Unit = {
...
}
}
然而,我只是设法让程序的入口点扩展 scalafx.application.JFXApp、javafx.application.Application(下面的示例)或 swing.SimpleSwingApplication,这迫使控制器知道如何视图被实现。有什么简单的解决方法吗?
def main(args: Array[String]): Unit = {
Application.launch(classOf[SimulatorApp])
}
class SimulatorApp extends Application {
override def start(stage: Stage): Unit = {
View.initView(stage)
}
}
好吧,您可以将应用程序设计为抽象的,例如
class MyApplication(dependency1: Dependency1, dependency2: Dependency2)
extends Application {
// code using things
}
然后将实现传递到其他地方
class MyApplicationImplemented
extends MyApplication(implementation1, implentation2)
Application.launch(classOf[MyApplicationImplemented])
依赖项可能是:
- 实例
- 实例(函数)的配方
- 配置
等等
你也可以将一些方法抽象化并在一些顶层实现它们。
通常,您将最终的 Application
实现视为使用 main
方法的 class - 这不是您将依赖项传递到其中的对象,而是您最终将它们连接在一起的地方。所以最后你得把它设计成你的main
。 (launch
方法的签名确认这是意图)。
也就是说可以将很多逻辑提取到 trait
s 或 abstract class
es 或组件中,这样您就可以在其他地方拥有一些通用逻辑,让它依赖于依赖注入,创建多个实现,并将它们连接在单独的“电源”中,例如生产代码和 end-to-end 测试。
我的目标是在模拟应用程序中使用 MVC 模式,其中控制器知道有一个视图(并使用接口与其交互)但不知道它是如何实现的:
object Controller extends App {
View.initView()
...
}
object View {
stage: Stage = ...
def initView: Unit = {
...
}
}
然而,我只是设法让程序的入口点扩展 scalafx.application.JFXApp、javafx.application.Application(下面的示例)或 swing.SimpleSwingApplication,这迫使控制器知道如何视图被实现。有什么简单的解决方法吗?
def main(args: Array[String]): Unit = {
Application.launch(classOf[SimulatorApp])
}
class SimulatorApp extends Application {
override def start(stage: Stage): Unit = {
View.initView(stage)
}
}
好吧,您可以将应用程序设计为抽象的,例如
class MyApplication(dependency1: Dependency1, dependency2: Dependency2)
extends Application {
// code using things
}
然后将实现传递到其他地方
class MyApplicationImplemented
extends MyApplication(implementation1, implentation2)
Application.launch(classOf[MyApplicationImplemented])
依赖项可能是:
- 实例
- 实例(函数)的配方
- 配置
等等
你也可以将一些方法抽象化并在一些顶层实现它们。
通常,您将最终的 Application
实现视为使用 main
方法的 class - 这不是您将依赖项传递到其中的对象,而是您最终将它们连接在一起的地方。所以最后你得把它设计成你的main
。 (launch
方法的签名确认这是意图)。
也就是说可以将很多逻辑提取到 trait
s 或 abstract class
es 或组件中,这样您就可以在其他地方拥有一些通用逻辑,让它依赖于依赖注入,创建多个实现,并将它们连接在单独的“电源”中,例如生产代码和 end-to-end 测试。