gpt4 book ai didi

oop - 为什么使用对象继承而不是 mixins

转载 作者:行者123 更新时间:2023-12-04 21:23:41 26 4
gpt4 key购买 nike

gist

比 mixins 更喜欢继承的原因是什么

给定以下伪代码示例:

class Employee

class FullTimeEmployee inherits Employee

class PartTimeEmployee inherits Employee

// versus

class Employee

class WorksPartTime

class WorksFullTime

class FullTimeEmployee includes Employee, WorksFullTime
class PartTimeEmployee includes Employee, WorksPartTime

如果我们要使用继承来构建对象,那么类关系将被视为一棵树,而对于 mixin,类关系将被视为一个平面列表。

假设我们使用的语言
  • 允许使用非冗长语法的混合
  • 让我们对待FullTimeEmployee作为 EmployeeFullTime对象透明。

  • 为什么我们应该将我们的类关系建立为树(继承)而不是平面列表(组合)?

    树与列表的示例。
    class Person

    class Employee inherits Person

    class FullTimeEmployee inherits Employee

    // -> FullTimeEmployee
    // Person -> Employee
    // -> PartTimeEmployee

    class Person

    class Employee includes Person

    class FullTime

    class FullTimeEmployee includes FullTime, Employee

    //
    // FullTimeEmployee = (FullTime, Employee, Person)
    //

    最佳答案

    我认为在支持 mixins 的语言中,它实际上与使用(多重)继承相同。在这两种情况下,所讨论的类/对象上都存在相同的方法/属性,两者的调用方式完全相同——没有实际区别。我还假设在这种假设的语言中,您也可以从多个“类”中“扩展”。

    如果这一切都是真的,那么在某种程度上它们是等价的,而且这个问题没有意义——两者都不比另一个更好,因为它们在功能上是等价的。

    以一种人类理解的方式,我认为大多数人会根据 isA 来考虑继承。关系,以及在用功能装饰事物方面的混合。

    如果您只能从一个“类”继承,那么显然 mixins 是一种获得多重继承的方法。

    编辑——根据你的评论,这很好,我想说假设语言的细节很重要。我承认我的回答基于 Sproutcore,它是一个 Javascript 框架,对 mixins 和继承都有正式的支持。在 SC 中,你可以做

    App.MyObject = SC.Object.extend({
    prop: 'prop',
    func: function(){
    })

    符合您的预期,它会放 propfuncMyObject的原型(prototype)上,创建一个“类”,它可以有子类。你也可以做
    App.MyObject = SC.Object.extend(App.OtherObject, {
    // stuff
    })

    它进行多重继承。然后你可以有类似的东西
    CommonFunctionality = {
    // some methods
    };

    App.mixin(CommonFunctionality);

    这将应用 CommonFunctionality东西到 App .如果 app 是命名空间(即 {} ),则 CommonFunctionality 的方法将应用于该对象文字。如果有意义,您也可以申请 CommonFunctionality到一个“类”,它的方法将在原型(prototype)上。如果您查看源代码,您会看到
    SC.extend = SC.mixin ;
    所以在 SC 中,绝对没有区别,因为它们是相同的方法。

    所以细节很重要——他们不必那样做,但他们做到了,而且有影响。如果他们的做法不同,那么当然会有不同的后果。

    关于oop - 为什么使用对象继承而不是 mixins,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7451344/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com