【问题标题】:JavaScript parameter dependent class inheritanceJavaScript 参数依赖类继承
【发布时间】: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


【解决方案1】:

我认为你在这里滥用了继承。如果不了解每个类的更多功能,很难确定,但我觉得您可以使用以下结构:

       Renderer (can render some data on screen, 
                 uses DataSource class instance 
                 to get the data to display)

       DataSource
      /          \
     /            \
    /              \
 DbData            JsonData
(fetch data        (uses data from JSON)
from the database)

有了这个结构,你可以使用renderer = new JsonRenderer(DbData(dbParams))renderer = new JsonRenderer(JsonData(data))

【讨论】:

  • 是的,这就是我所做的 - 创建单独的 JsonDataProvider 类,并在 JsonRenderer 的构造函数中根据提供的 dbParams 或 JSON 数据选择要使用的 dataProvider
猜你喜欢
  • 2021-02-12
  • 2014-12-31
  • 2015-06-23
  • 2013-04-01
  • 2023-03-28
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多