【发布时间】:2017-10-30 18:17:47
【问题描述】:
我有以下类层次结构:
Renderer (can render some data on screen)
|
DbRenderer (fetch data from the database)
|
JsonRenderer (my class. converts specific data into needed format supported by Renderer)
它工作得很好,但需要将 DB 连接参数传递给 JsonRenderer 构造函数,以便通过 super() 调用 DbRenderer 的构造函数(),因为这个参数在那里是强制性的。
所以,它看起来像:
const renderer = new JsonRenderer(dbParams);
,在哪里
class JsonRenderer extends DbRenderer {}
但是,我想将 dbParams 设为可选并将类层次结构更改为以下内容:
Renderer
|
JsonRenderer
我可以通过创建单独的类来做到这一点:
class JsonRenderer2 extends Renderer {}
当然,单独的课程会导致代码重复,这不是一个好主意。
在不更改 Renderer 和 DbRenderer 父类的情况下,是否有针对我的情况的解决方案?
【问题讨论】:
-
JsonRenderer不应该是DbRenderer的子代,如果它不是DbRenderer。总的来说,DbRenderer首先扩展了Renderer似乎很奇怪。它实际上是渲染任何东西,还是更像是其他渲染器可以使用的数据源?也许不同的模型更适合你的宇宙。 -
DbRenderer只是获取一些数据。JsonRenderer知道如何将这些数据转换并传递到Renderer以显示在屏幕上。 -
DbRenderer不应扩展Renderer。似乎它应该作为数据源传递给JsonRenderer。一般来说,类继承应该只用于 is-a 关系。例如。狗是一种动物。
标签: javascript oop design-patterns