【问题标题】:How to use Mixins for every type of inheritance?如何为每种类型的继承使用 Mixins?
【发布时间】:2018-02-19 02:51:27
【问题描述】:

我最近主要通过the article Real Mixins with javascript classes在javascript中看到了Mixin的概念。据我了解,这是一种使用抽象类进行多重继承的方法,它更像是组合而不是继承。我也在阅读关于继承的概念组合,如the article Composition Over Inheritance。我知道关于继承和组合的讨论可能会很长,但我选择尽可能避免继承(至少现在是这样)。

所以我想在 ES6 中尽可能多地使用 Mixins,在大多数示例中,我看到了三个类,例如 class A extends MixinB(C)。如果我只想扩展 B 类怎么办?我会做类似class A extends MixinB(Object) 的事情吗?正如Mozilla documentation 所说,这可能是一种反模式。

请注意,我可以像 class A extends B 那样直接继承,但是像这样 B 不再是 Mixin,如果我想将它用作 Mixin,我需要一个不同的 B 声明。

【问题讨论】:

  • “继承并不总是正确的模式”并不意味着“把你学到的这个新东西塞进你以前使用继承的每个地方”。
  • 请注意,有些 JavaScript 博主完全搞错了构图。 reddit.com/r/programming/comments/5dxq6i/… 。 Mixin 和多重继承确实是一回事,但组合都不是。
  • > 正如 Mozilla 文档所述,这可能是一种反模式。 | MDN 文档说的是猴子补丁,这确实很糟糕,但是猴子补丁不是 class extends 所做的。
  • @JeffM ... 与您的 reddit 链接用户 MoTTs_ 确实提到了aggregation。所以当评论说组合是包含,继承是混合时,应该更正为包含是聚合,“混合”可以通过组合和继承来实现。当人们使用某种 Mixin/Trait 模式时,Object.assignclass ... extends 他们,至少在 JavaScript 中,总是在编写;但继承还提供/涵盖子类型。然后 OP 的 Q 将变为 “如何将 Mixins 用于每种类型的组合?”
  • @PeterSeliger 组合和聚合实际上是一回事。它们仅在所包含对象的所有权上有所不同。然而,我们选择区分 mixin 或 trait 或继承并不会改变我们遇到的具体问题。例如,Object.assign 仍然容易受到脆弱基础问题的影响,这是我们通常与继承相关联的问题。

标签: javascript class inheritance design-patterns mixins


【解决方案1】:

我认为您正在寻找的解决方案是更改 Mixin 函数的定义。

而不是:

MixinB(WhateverClass)

你可以:

Mixin(MainClass, otherClass1, otherClass2...)

这是真的:

MixinB(C) = Mixin(B, C)

【讨论】:

    【解决方案2】:

    我不喜欢这个声音!

    所以我想尽可能多地使用 Mixins

    在适当的地方使用 mixin,而不是因为你想使用它们。继承适用于固定的、牢固的关系。当您想要与许多不相关的类共享一小部分功能时,Mixins 很有用。

    【讨论】:

    • 拜托,不要以为我想用 Mixins 让我的代码变得更糟,我的意思是“我想尽可能多地使用 Mixins” “可以”我的意思是“所以这里最好使用继承吗?使用 Mixin 会很笨拙吗?好吧,我会使用继承”。您的回答更像是评论,因为您没有回答我所做的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多