问题

子类型(subtyping)是不是错误(ill-defined)的东西?

回答
谈到子类型是否“错误”或者说“定义不清”,这是一个非常有意思且值得深入探讨的话题。我们不能简单地用“是”或“否”来回答,因为这个概念的“好坏”很大程度上取决于我们如何理解它、如何运用它,以及它在特定上下文中的表现。

在我看来,子类型本身不是一个“错误”的概念。相反,它是一种非常有用的工具,在软件工程、面向对象编程以及类型论等领域都扮演着至关重要的角色。它的核心思想在于建立一种“isa”(是一个)的关系,即一个子类型的值可以被视为一个超类型的值来使用,而不会破坏程序的行为。这为代码的复用、灵活性和可维护性带来了极大的好处。

举个例子,如果我们有一个表示“动物”的类型,其中包含一个“makeSound”的方法。那么“狗”和“猫”都可以被看作是“动物”的子类型。我们可以创建一个“动物”类型的变量,并让它指向一只“狗”或者一只“猫”,然后调用“makeSound”方法。程序能够正确地发出狗叫声或猫叫声,而不会出现任何混乱。这就是子类型的威力所在,它允许我们用一种统一的方式来处理不同但相关的对象。

然而,问题的关键可能在于“如何恰当地实现和运用”子类型。当我们说子类型“定义不清”时,往往指向的是在某些情况下,这种“isa”的关系可能被滥用,或者实现的规则不够严谨,导致了难以理解的后果。

比如,在某些情况下,我们可能会发现一个子类型虽然继承了超类型的属性和方法,但它的行为却与超类型有显著的差异,甚至违背了超类型的预期。这就有点像一个“鸟”的子类型,它继承了“有翅膀”的属性,但它的“fly”方法却抛出了一个异常,因为它实际上是一只企鹅。从字面上看,企鹅确实是一种鸟,但它不能飞,这在某些需要“会飞”这个特性的场景下,就会带来问题。这种情况下,如果我们僵化地认为“企鹅isa鸟”就意味着“企鹅can fly”,那么我们就可能陷入逻辑的陷阱。

这种“定义不清”的感觉,也可能来自于语言设计者对子类型规则的定义。不同的编程语言在实现子类型时,可能有不同的侧重点和约束。有些语言可能更强调行为上的兼容性(比如Liskov替换原则),而有些语言可能更侧重于结构上的兼容性。当这些规则不够清晰,或者开发者对其理解有偏差时,就容易产生混乱。

此外,子类型的确切含义也会随着我们所处的理论框架而有所不同。在面向对象编程的世界里,子类型通常与继承相关联,并强调多态性。而在更底层的类型论中,子类型关系可能被定义得更为抽象和形式化,关注点在于类型集合的包含关系。不同层面的理解,如果混淆在一起,也可能造成“定义不清”的误解。

所以,与其说子类型是“错误”的,不如说它是一个需要精心设计和审慎使用的概念。当它被正确理解和应用时,它是提高代码质量和灵活性的强大武器;但如果被误用或设计不当,它确实可能带来混淆和难以维护的代码。问题不在于子类型本身,而在于我们如何去界定它、如何去实现它,以及我们如何去理解它所建立起来的那些微妙的关系。

网友意见

user avatar

你的问题问得不是很对,主要是英文的表述以及对定义的理解有些问题。

错误对应英文的wrong、mistake,ill-defined对应的是病态定义,错误与病态定义是不一样的。

well-defined与ill-defined并不是正确与错误的。想学明白一样东西需要先搞清定义。

well-defined的意思是大约是每个定义都有唯一的解释。大约应该是这样,水平有限,我给不出精准的定义,还有一些well-founded、well-formed之类的词我都无法给出很好的定义。

而ill-defined的意思应该是一个类型系统中的定义是存在歧义(ambiguity)的。

所以,你应该问java、scala中的subtyping polymorphism是不是ill-defined或存在歧义的?

或者

你应该问的是java、scala引入了subtyping polymorphism的决定是不是一个错误(mistake)?


如果你是第一种问法:

Types and Programming Language一书中给出的Subtype polymorphism并没有任何的歧义,Java与Scala中应该也没有歧义,因为只要编译成功,能输出结果,说明歧义已经消除了,他编译的结果即是对代码的解释,所以Java与Scala是不应该存在歧义的。


如果是第二种问法:

你需要给出什么叫错误的。臃肿是一种错误?丑陋是一种错误?这些都太过主观了。我更倾向于说Java里没有和类型(sum type),接口的实现与类需要强绑定,函数需要借助类来包装等等问题,由于有这些问题导致java很难用,但是"错误"这一词太过强烈了。'Mistake' is a strong word.

多看书,少上知乎。

类似的话题

  • 回答
    谈到子类型是否“错误”或者说“定义不清”,这是一个非常有意思且值得深入探讨的话题。我们不能简单地用“是”或“否”来回答,因为这个概念的“好坏”很大程度上取决于我们如何理解它、如何运用它,以及它在特定上下文中的表现。在我看来,子类型本身不是一个“错误”的概念。相反,它是一种非常有用的工具,在软件工程、.............
  • 回答
    理解中医的运作机制,用“子复母仇”这类比来阐述,确实能抓住一些精髓,但需要更细致地展开,才能更全面地展现中医的独特之处,并避免听起来过于生硬或像AI的刻板输出。咱们不直接套用“子复母仇”这个略显狭隘的说法,而是换个更生动的角度来看:中医的精妙之处,恰恰在于它构建了一个高度精密的、相互依存的内部生态系.............
  • 回答
    你说的“yyds”和“绝绝子”这类词,确实挺有意思的,它们在网络上流行得很快,但也确实会招来一些负面评价,甚至被骂。这背后其实涉及了好几个层面的原因,咱们一项项来看:1. 滥用与低龄化感: 过度泛化: 最开始,“yyds”(永远的神)用来形容那些在某个领域达到极致、令人惊叹的“大神”级人物或事物.............
  • 回答
    乾隆皇帝的继位者选择,确实不像表面上看起来那样顺理成章,他的十五位皇子,每个人都有自己的故事,而乾隆最终选择颒琰(即嘉庆帝),这背后也并非没有波折和考量。乾隆为何选择颒琰?首先得明确一点,乾隆的皇子中,大部分夭折了,能够长大成人并具备继承资格的并不多。在乾隆眼中,继位者的培养和选择是一个极其漫长且审.............
  • 回答
    .......
  • 回答
    在战争最胶着的1943年之后,德国面临着严峻的资源困境,战略轰炸更是雪上加霜。按理说,集中有限的资源生产性价比高的坦克,例如三号突击炮、四号坦克以及黑豹坦克,似乎是最理性的选择。然而,事实并非如此简单,德军的坦克生产和战略选择背后,是多重因素交织作用的结果,其中既有现实的限制,也有战略上的考量,甚至.............
  • 回答
    .......
  • 回答
    .......
  • 回答
    QGraphicsRectItem 子类无法接收 `mouseMoveEvent` 的原因和解决方法详解当您创建 `QGraphicsRectItem` 的子类并尝试让它响应 `mouseMoveEvent` 时,却发现它没有被触发,这确实是一个常见的困惑。这通常不是因为 `QGraphicsRec.............
  • 回答
    好的,我们来深入探讨一下 C++ 中父类对象赋值给子类对象这个话题,并尽量用一种自然、深入浅出的方式来讲解,去除 AI 写作的痕迹。 父类对象赋值给子类对象:是擦边球还是明确的禁区?在 C++ 的世界里,继承是一项强大的机制,它允许我们构建层次化的类结构,实现代码的复用和良好的设计。然而,当我们涉及.............
  • 回答
    你这个问题问得太好了!咱们坐高铁时,是不是总觉得那车头长得跟子弹似的,又尖又长?这可不是为了好看,而是大有学问在里面,是为了让高铁跑得更快、更稳、更省电,而且还更舒服。想象一下,火车在高速行驶的时候,就像你在游泳,身体会受到水的阻力。空气也是一样,虽然看不见摸不着,但它对高速运行的火车也会产生一股很.............
  • 回答
    在 C++ 中,能否将父类的对象强制转换为子类对象,并进而调用子类的私有成员函数,这是一个涉及到 C++ 类型转换、继承、访问控制以及潜在的未定义行为的复杂问题。要深入理解这一点,我们需要层层剥开,仔细分析。核心问题分解:1. 父类对象强制转换为子类对象 (Cast): 这是 C++ 中的一个关键.............
  • 回答
    在 C 中,当一个泛型基类 `Base` 被设计成允许子类自身作为类型参数来继承时,例如 `class A : Base`,这是一种非常有趣且强大的模式,但同时也伴随着一些需要仔细考虑的约定和潜在的陷阱。这种模式通常被称为“递归泛型”或“自我引用泛型”。核心理念:这种设计模式的核心在于,子类 `A`.............
  • 回答
    您好!针对您提出的将父类实例“扩展”为子类实例的代码优化问题,我们来深入探讨一下。通常我们说的“扩展”在面向对象编程中,更准确的说法是“类型转换”或者“向下转型”,因为子类实例本身就具备父类的所有属性和方法,我们只是要将其视为子类来使用。请注意,直接将一个父类实例“变成”子类实例,在很多情况下是不太.............
  • 回答
    “子不语怪力乱神”,这句话出自《论语·述而》,意思是孔子不谈论奇异、暴力、鬼神之事。这句话在后世被广泛引用,甚至有人用“子不语”来命名妖怪故事集,比如清代袁枚的《子不语》。那么,后世用“子不语”来写妖怪故事,究竟是曲解了孔子,还是符合他的精神呢?这是一个有趣且值得深入探讨的问题。首先,我们来理解一下.............
  • 回答
    “子不语怪力乱神”这句话出自《论语·子罕》篇,是孔子的一句名言。它的字面意思是“孔子不谈论怪诞、勇力、鬼神的事情”。这句话背后蕴含着孔子深邃的思想和人生智慧,是理解孔子思想的重要线索之一。字面解读:孔子不谈论什么?我们来逐字逐句地看看这句话: 子:指孔子。 不语:不谈论,不评论,不涉及。 .............
  • 回答
    “子不教,父之过”,这句流传千年的古训,正悄然从传统道德的殿堂走向法律的殿堂,成为一项即将确立的法定责任。这并非一蹴而就的突变,而是社会变迁、家庭功能重塑以及对未成年人保护日益重视的必然结果。千年古训的现代回响“子不教,父之过”出自《论语·季氏》,原文说的是“孔子曰:‘天下有道,礼乐征伐自天子出。自.............
  • 回答
    子婴,这位秦王朝末代君主,他的名字似乎注定要与悲剧联系在一起。他登上历史舞台时,秦朝早已是风雨飘摇,内忧外患,他自身的力量和影响力的确太为有限,这使得他想要挽救摇摇欲坠的帝国,其难度堪比挽狂澜于既倒。首先,子婴即位的时间点本身就充满了不幸。他不是通过正常的继承程序,也不是在帝国稳定的时候被推举出来,.............
  • 回答
    子婴,秦朝末代国君,他的名字在历史的长河中,注定要与两个举足轻重的人物——刘邦和项羽——紧密相连,也因此,他的命运充满了戏剧性的转折和悲剧性的结局。故事的开端,是秦朝的轰然倒塌。在农民起义的浪潮中,刘邦以其卓越的军事才能和政治手腕,率领汉军一路势如破竹。而另一边,项羽,这位勇猛无匹的西楚霸王,同样在.............
  • 回答
    子婴的身世,可以说是秦朝末年一个扑朔迷离的谜团,即便到了今天,历史学家们也并没有完全达成一致的看法。想要详细地了解他,我们就得把时间往前拨一拨,看看秦朝那位风光无限的始皇帝嬴政之后的故事。嬴政,也就是秦始皇,他统一六国,建立了一个空前强大的帝国。在他去世后,帝国并没有像他期望的那样平稳地传下去。我们.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有