Language agnostic 元组应该相互子类化吗?

Language agnostic 元组应该相互子类化吗?,language-agnostic,inheritance,tuples,Language Agnostic,Inheritance,Tuples,在OOP语言中给定一组元组类:Pair,Triple和Quad,Triple子类Pair,Quad子类Triple 在我看来,问题在于三元组是否可以作为对替换,四元组是否可以作为三元组或对替换。三元组是否也是一对,四元组是否也是三元组和一对 在一种情况下,这种关系可能对可扩展性很有价值——今天这个东西返回一对东西,明天我需要它返回一个三元组,而不破坏现有的调用方,它们只使用三元组中的前两个 另一方面,它们应该是不同的类型吗?我可以从更强的类型检查中看到好处——您不能将三元组传递给需要一对的方法

在OOP语言中给定一组元组类:Pair,Triple和Quad,Triple子类Pair,Quad子类Triple

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

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

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

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

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

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


编辑:我认为这些更像是松散耦合的群体;不是特别针对x/y x/y/z坐标之类的东西,尽管它们可能用于这样的情况。这就像是需要一个通用的解决方案来处理一个方法的多个返回值,但是要采用一种语义非常简单的形式


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

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

你们甚至可以实现一个集合接口

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


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

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

你们甚至可以实现一个集合接口

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


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

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

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

这取决于您需要的语义-

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

如果您的语义是简单的组合,那么泛型类元组将更有意义

它取决于您需要的语义-

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

如果您的语义是简单的组合,那么泛型类元组将更有意义

不同长度的元组是不同的类型。(无论如何,在许多类型系统中)在强类型语言中,我不认为它们应该是一个集合

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

另一个潜在的问题是,如果您决定使用重载。如果元组彼此继承,则重载解析将在不应该的地方失败。但这可能是一个更好的反对重载的论点

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


编辑:如果您想了解一般信息,请尝试仔细阅读Haskell或ML系列(OCaml/F#)以了解它们的使用方式,然后形成您自己的决定。

不同长度的元组是不同的类型。(无论如何,在许多类型系统中)在强类型语言中,我不认为它们应该是一个集合

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

另一个潜在的问题是,如果您决定使用重载。如果元组彼此继承,则重载解析将在不应该的地方失败。但这可能是一个更好的反对重载的论点

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

编辑:如果您想了解一般信息,请尝试仔细阅读Haskell或ML系列(OCaml/F#)以了解它们的作用