代码之家  ›  专栏  ›  技术社区  ›  L. Cornelius Dol

元组应该相互子类化吗?

  •  1
  • L. Cornelius Dol  · 技术社区  · 17 年前

    在我看来,问题在于三元组是否可以作为对替换,四元组是否可以作为三元组或对替换。是否三重 也是 也是 一个三人组和一对。

    在一种情况下,这种关系可能对可扩展性很有价值——今天这个东西返回一对东西,明天我需要它返回一个三元组,而不破坏现有的调用方,它们只使用三元组中的前两个。

    另一方面,它们应该是不同的类型吗?我可以从更强的类型检查中看到好处——您不能将三元组传递给需要一对的方法。

    我倾向于使用继承,但我真的很感激别人的意见吗?

    PS:如果有关系的话,这些课程(当然)是通用的。

    PPS:从更主观的角度来看,名称应该是Tuple2、Tuple3和Tuple4吗?


    也就是说,我对其他人实际使用元组的所有方式都感兴趣。

    6 回复  |  直到 17 年前
        1
  •  1
  •   user57368    17 年前

    在我看来,您应该创建一个通用的元组接口(或者使用上面提到的集合),并让您的pair和3元组类实现该接口。这样,您可以利用多态性,但也允许对使用比任意大小的元组更简单的实现。您可能希望使元组接口包含.x和.y访问器,作为前两个元素的简写,较大的元组可以根据需要为索引较高的项实现自己的简写。

        2
  •  1
  •   MichaelGG    17 年前

    这是一件好事,因为它确保了更多的安全。返回元组的地方通常有一些耦合的信息,即每个组件的隐含知识。如果在元组中传递的值比预期的多,情况会更糟——这意味着什么?它不适合继承。

    当然,如果您有一个特定的用例,并且发现某些行为将帮助您,那么这些都不重要。

        3
  •  1
  •   amit    17 年前

    像大多数与设计相关的问题一样,答案是——这要看情况而定。

    如果您正在寻找传统的元组设计,那么Tuple2、Tuple3等就是最佳选择。继承的问题是,首先,三元组不是成对的类型。您将如何为它实现equals方法?三元组是否等于前两项相同的一对?如果你有一个对的集合,你能给它添加三元组吗?反之亦然?如果在您的域中这是好的,您可以使用继承。

        4
  •  1
  •   Steven A. Lowe    17 年前

    这取决于您需要的语义-

    • 一对对立物在语义上与类似对象的三元组不兼容
    • 极坐标空间中的一对坐标在语义上与欧几里德空间中的三元组坐标不兼容

    如果您的语义是简单的组合,那么一个通用类元组<N>会更有意义

        5
  •  0
  •   Stephen    17 年前

    我会选择0,1,2或无穷大。e、 空,1个对象,你的Pair类,或者是某种类型的集合。

    如果三个或四个项目之间存在特定关系,则可能应该命名。

    [也许我忽略了这个问题,但我想不出哪种情况下我想以一种通用的方式具体链接3件事情]

        6
  •  0
  •   Community Mohan Dere    6 年前

    blogged about tuples ,我觉得读起来很有趣。

    他提出的一点(我还不能判断是否正确)是:

    文字元组最好定义为只读。原因之一是只读元组更具多态性。长元组是短元组的子类型:

    {S.T.U.V}<={S.T.U}<={S.T}<={S}

    [和]只读元组是协变的:

    T1<=T2、S1<=S2==>{S1.T1}<={S2.T2}

    这似乎表明我倾向于使用继承可能是正确的,并且与amit.dev所说的三元组是正确的相矛盾 一双。