什么时候应该使用抽象类而不是常规类?更具体地说,我试图理解何时应优先使用构造函数参数而不是抽象成员。
例如:
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 = ???)
据我所知,两者都是有效的。
答案 0 :(得分:0)
如@Luis Miguel所说,当您要声明一组需要由子类实现的方法和/或共享某些将被所有子类使用的有限功能时,请使用抽象类。
下面,我列出了一些我为什么应该将依赖项传递给构造函数而不是在类/基类中定义它们的原因。
(IMHO)最好为构造函数提供正常运行所需的依赖项,即 dependency injection 。
在类或构造函数中声明依赖项时,您将Service
与该依赖项的特定实现紧密结合,这是不理想的,{{3 }}。
注入依赖项可为您提供更大的灵活性,因为您没有耦合到特定的实现。 只要您的代码依赖于interface / trait / abstract-class (因此避免紧密耦合),这都是正确的。
当您的类依赖于interface / trait / abstract-class时,它可能会非常强大,因为您可以传递客户端的模拟,无操作或其他策略。因此,请确保您“编程为接口,而不是实现”。。