构造函数参数与抽​​象成员(类与抽象类)

时间:2019-08-13 19:59:33

标签: scala class abstract-class

什么时候应该使用抽象类而不是常规类?更具体地说,我试图理解何时应优先使用构造函数参数而不是抽象成员。

例如:

sealed trait Client

abstract class BaseService {
  def client: Client
}

class Service extends BaseService {
  val client = ???
}

vs

sealed trait Client

class BaseService(client: Client) {}

class Service extends BaseService(client = ???)

据我所知,两者都是有效的。

1 个答案:

答案 0 :(得分:0)

如@Luis Miguel所说,当您要声明一组需要由子类实现的方法和/或共享某些将被所有子类使用的有限功能时,请使用抽象类。

下面,我列出了一些我为什么应该将依赖项传递给构造函数而不是在类/基类中定义它们的原因。

使用依赖注入

(IMHO)最好为构造函数提供正常运行所需的依赖项,即 dependency injection

避免紧密耦合

在类或构造函数中声明依赖项时,您将Service与该依赖项的特定实现紧密结合,这是不理想的,{{3 }}。

程序到接口,而不是实现

注入依赖项可为您提供更大的灵活性,因为您没有耦合到特定的实现。 只要您的代码依赖于interface / trait / abstract-class (因此避免紧密耦合),这都是正确的。

当您的类依赖于interface / trait / abstract-class时,它可能会非常强大,因为您可以传递客户端的模拟,无操作或其他策略。因此,请确保您“编程为接口,而不是实现”。