需要多重继承时的正确方法(TypeScript)
Correct approach when multiple inheritance is needed (TypeScript)
首先 mixins 不是最好的解决方案,因为我的接口很大,我想避免编写空的实现。
我正在寻找的是哪种方法(技术)最适合多重继承。我的问题是钻石继承(是的,我读过钻石问题)。
// -----------------------
// | Edit |
// -----------------------
// / \
// / \
// / \
// ----------------------- -----------------------
// | DataSetEdit | | OEdit |
// ----------------------- -----------------------
// \ /
// \ /
// \ /
// -----------------------
// | ODataSetEdit |
// -----------------------
逻辑很简单。
- 编辑基本上是一些
<input type="textbox">
以及一些用于验证、掩码、输入检查的附加方法...
- OEdit 使用一些额外的样式方法扩展了 edit。可以从服务器应用程序 (WebSocket) 获取属性,向服务器发送事件
- DataSetEdit 添加了处理编辑属性(文本、颜色、标题、占位符...)的方法和属性 - 当当前记录发生更改时自动处理更改。 (DataSet 为 class,其数据为 Object[]。)
- ODataSetEdit 扩展了 OEdit 功能,但还需要 DataSetEdit 方法来处理 DataSet 上的更改。
在一个项目中我使用 DataSetEdit,而在另一个项目中我总是使用 ODataSetEdit。所以在使用ODataSetEdit的项目中,我只需要复制DataSetEdit功能即可。
我不想在 DataSetEdit 和 ODataSetEdit 中重复代码。
我在想我是否可以用以下方法解决这个问题:
- 一些静态methods/properties方法
- 装饰器(可能在构造函数上扩展 class 功能)
- DataSetEdit 上的一些静态方法,可以从 ODataSetEdit 调用以使用 DataSetEdit 扩展 OEdit 功能
- 从 ODataSetEdit 到 DataSetEdit 的代理方法和属性
- 某种composition(在这个具体示例中设计看起来如何)
ODataSetEdit 应该扩展 OEdit 但能够使用在 DataSetEdit 中添加的功能。
我认为class结构是逻辑的,如何在我的设计中避免多重继承的需要?我确定这是与 TypeScript 无关的常见问题。
how can I avoid need for multiple inheritance in my design
将逻辑从 OEdit 移到函数/变量中(随意使用命名空间:https://basarat.gitbooks.io/typescript/content/docs/project/namespaces.html 将它们收集成有意义的东西),然后在 OEdit 和 ODataSetEdit 之间共享它们。
更多
从根本上说,您需要将逻辑移出到至少一个直系子级和孙级可以访问的位置。没有两种解决方法。
首先 mixins 不是最好的解决方案,因为我的接口很大,我想避免编写空的实现。
我正在寻找的是哪种方法(技术)最适合多重继承。我的问题是钻石继承(是的,我读过钻石问题)。
// -----------------------
// | Edit |
// -----------------------
// / \
// / \
// / \
// ----------------------- -----------------------
// | DataSetEdit | | OEdit |
// ----------------------- -----------------------
// \ /
// \ /
// \ /
// -----------------------
// | ODataSetEdit |
// -----------------------
逻辑很简单。
- 编辑基本上是一些
<input type="textbox">
以及一些用于验证、掩码、输入检查的附加方法... - OEdit 使用一些额外的样式方法扩展了 edit。可以从服务器应用程序 (WebSocket) 获取属性,向服务器发送事件
- DataSetEdit 添加了处理编辑属性(文本、颜色、标题、占位符...)的方法和属性 - 当当前记录发生更改时自动处理更改。 (DataSet 为 class,其数据为 Object[]。)
- ODataSetEdit 扩展了 OEdit 功能,但还需要 DataSetEdit 方法来处理 DataSet 上的更改。
在一个项目中我使用 DataSetEdit,而在另一个项目中我总是使用 ODataSetEdit。所以在使用ODataSetEdit的项目中,我只需要复制DataSetEdit功能即可。
我不想在 DataSetEdit 和 ODataSetEdit 中重复代码。 我在想我是否可以用以下方法解决这个问题:
- 一些静态methods/properties方法
- 装饰器(可能在构造函数上扩展 class 功能)
- DataSetEdit 上的一些静态方法,可以从 ODataSetEdit 调用以使用 DataSetEdit 扩展 OEdit 功能
- 从 ODataSetEdit 到 DataSetEdit 的代理方法和属性
- 某种composition(在这个具体示例中设计看起来如何)
ODataSetEdit 应该扩展 OEdit 但能够使用在 DataSetEdit 中添加的功能。
我认为class结构是逻辑的,如何在我的设计中避免多重继承的需要?我确定这是与 TypeScript 无关的常见问题。
how can I avoid need for multiple inheritance in my design
将逻辑从 OEdit 移到函数/变量中(随意使用命名空间:https://basarat.gitbooks.io/typescript/content/docs/project/namespaces.html 将它们收集成有意义的东西),然后在 OEdit 和 ODataSetEdit 之间共享它们。
更多
从根本上说,您需要将逻辑移出到至少一个直系子级和孙级可以访问的位置。没有两种解决方法。