我具有以下类层次结构:

  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)


它运行良好,但需要将数据库连接参数传递到JsonRenderer构造函数中,以便通过super()调用DbRenderer的Constructor(),因为该参数在那里是必需的。

因此,它看起来像:

const renderer = new JsonRenderer(dbParams);


,在哪里

class JsonRenderer extends DbRenderer {}


但是,我想使dbParams成为可选的并将类层次结构更改为以下内容:

   Renderer
      |
  JsonRenderer


我可以通过创建单独的类来做到这一点:

class JsonRenderer2 extends Renderer {}


当然,单独的类将是代码重复的来源,这不是一个好主意。

在不更改Renderer和DbRenderer父类的情况下,是否有适合我的情况的解决方案?

最佳答案

我认为您在这里滥用了继承权。在不了解每个类的作用的情况下很难确定,但是我觉得可以改用以下结构:

       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))

10-01 16:12