需要多继承时的正确方法(TypeScript)

时间:2016-08-19 08:25:35

标签: oop inheritance typescript multiple-inheritance

首先mixins不是最好的解决方案,因为我的接口很大,我想避免编写空实现。

我正在寻找的是哪种方法(技术)最适合多重继承。我的问题是钻石继承(是的,我读过钻石问题)。

//                   -----------------------
//                   |         Edit        |
//                   -----------------------
//                  /                  \
//                 /                    \
//                /                      \
//    -----------------------         -----------------------
//    |     DataSetEdit     |         |        OEdit        |
//    -----------------------         -----------------------
//                    \                    /
//                     \                  /
//                      \                /
//                    -----------------------
//                    |     ODataSetEdit    |
//                    -----------------------

逻辑很简单。

  • 编辑基本上是一些<input type="textbox">,还有一些额外的验证方法,掩码,输入检查......
  • OEdit使用一些其他方法进行样式扩展编辑。可以从服务器应用程序(WebSocket)获取属性,将事件发送到服务器
  • DataSetEdit添加了处理编辑属性(文本,颜色,标题,占位符...)的方法和属性 - 自动处理当前记录更改时的更改。 (DataSet是类,其数据是Object []。)
  • ODataSetEdit扩展了OEdit功能,但还需要DataSetEdit方法来处理DataSet上的更改。

在一个项目中我使用DataSetEdit而在另一个项目中我总是使用ODataSetEdit。所以在使用ODataSetEdit的项目中,我只需要复制DataSetEdit功能。

我不想在DataSetEdit和ODataSetEdit中复制代码。 我在想是否可以用以下方法解决这个问题:

  • 一些静态方法/属性方法
  • 装饰器(可能在构造函数上扩展类功能)
  • DataSetEdit上的一些静态方法,它将从ODataSetEdit调用以使用DataSetEdit扩展OEdit功能
  • 从ODataSetEdit到DataSetEdit的代理方法和属性
  • 某种composition(在这个具体例子中,设计将如何看待)

ODataSetEdit应该扩展OEdit,但能够使用DataSetEdit中添加的功能。

我认为类结构是逻辑的,我怎样才能避免在我的设计中需要多重继承呢?我确信这是与TypeScript无关的常见问题。

1 个答案:

答案 0 :(得分:3)

  

如何在设计中避免需要多重继承

将逻辑从OEdit中移出到函数/变量中(随意使用命名空间:https://basarat.gitbooks.io/typescript/content/docs/project/namespaces.html将这些逻辑收集到有意义的东西中),然后在OEdit和ODataSetEdit之间共享它们。

更多

从根本上说,你需要将逻辑移到一个至少有一个直接孩子和大孩子可以进入的地方。没有两种方法。