【问题标题】:Is-a, extends, 'inherits': What is your preferred term for "inheritance" and why?Is-a, extends, 'inherits':您对“继承”的首选术语是什么,为什么?
【发布时间】:2009-10-27 02:38:07
【问题描述】:

一个主观的问题,因此如果有投诉我会在维基上,但我想知道人们对用于继承的不同术语的看法几乎可以互换。

我们有“is-a”、“extends”、“derives”、“subclasses”和简单的“inherits”

我们选择的单词包含很多含义。您对“继承”的首选术语是什么?为什么?

要引人注目!

【问题讨论】:

  • 请把它写成 wiki,这个没有单一的答案。
  • 没错,但肯定有一个对提问者最有吸引力。使其成为社区 wiki 意味着没有人会因为他们的答案而获得代表,这不会为高质量的答案提供动力。
  • 是的,对提问者最有吸引力。但另一位提问者可能有不同的观点。这就是为什么它被标记为主观的。这就是为什么它应该是 CW,无论代表如何。
  • @Pascal Thivent:我不是唯一一个投票的人。然后整个社区都会这样做。

标签: language-agnostic inheritance terminology


【解决方案1】:

我最常使用“A 子类 B”(非常直接)或“A 从 B 继承”(稍微迂回一些)。 “扩展”在它是关键字的语言(如 Java)中很好,但出于某种原因,将它用于(例如)C++ 或 Python 似乎有点牵强。 “IS-A”是继承必须尊重的关系约束(Liskov 原则)并在实例(左侧)和类(右侧)之间保持 - 所以你可以说“x IS-A Foo”(当 x 是一个实例时Foo 或 Foo 的任何子类),但“Bar IS-A Foo”(它们都是类)似乎是错误的,它会在类也是(元)类(如 Python)的实例的语言中引起混淆。

【讨论】:

    【解决方案2】:

    我喜欢说派生,因为它强烈暗示类/子类关系,但在更奇特的情况下会相当准确,例如多重继承、接口实现和混合。

    我有各种次要论点。一方面,“父母”和“孩子”强烈暗示可能与实际关系发生冲突的特定结构类比。另一方面,重点是代码和抽象本身的重用。如果内存是空闲的,并且我们每分钟都输入一百万字,那么复制和粘贴代码仍然不是一个好主意,因为这会隐藏各种抽象之间的关系。 派生清楚地表明,您所做的至少是共享您开始使用的抽象的一部分。

    【讨论】:

    • 很好的论据——出于许多相同的原因,我喜欢“扩展”。类主要是关于用数据封装行为,所以它通常对我来说最有意义。
    【解决方案3】:

    我很难考虑,如果您可以在“A 是 B”(鲸鱼是哺乳动物)关系之间连接到 A 类和 B 类,那么它们就会受到继承的约束。

    所以我更喜欢 IS A

    【讨论】:

    • 问题是,这并不总是有效。通常,类代表不适合漂亮隐喻的抽象概念和实体。我在适当的情况下使用“is a”(主要与“has a”表示组合),但我不认为它是一个广泛适用的选择术语。
    【解决方案4】:

    不同语言有不同的术语。

    "is a" 适合动态语言并反映 perl/php/python 和 javascript 对象的嵌合特性。 Lassie 是狗,是哺乳动物,是宠物,是电影明星,也是米高梅的资产。

    “extends”适合 Java 的声明式、严格类型(以及它缺乏多重继承!)。 《Lassie extends Dog》,用 Java 实现的 Lassie 可以走路和吠叫,但不能出演或表演!

    【讨论】:

    • 好点,但在您的示例中,“is a”可以很容易地表示组合,而不是继承。 (事实上​​,我认为使用多重继承来满足所有这些约束可能是糟糕的设计。)同样,你可以说一些东西比其他东西“扩展”更多,尽管我同意它最适合单继承。
    【解决方案5】:

    有两种方式来考虑继承:

    is-a :多态是指接口由基类定义,但实现可以由继承的类提供。

    public class Polygon
    {
       public abstract int Points();
    };
    
    public class Triangle : Polygon
    {
      public override int Points() { return 3; }
    }
    
    void Foo( Polygon p )
    {
      int points = p.Points();
    }
    
    main()
    {
       Foo( new Triangle() );
    }
    

    扩展 - 一种捕获共享实现的方式。

    public class iTouch
    {
        // cool pda features
    }
    
    public class iPhone : private iTouch
    {
        // phone features
        // cool pda features comes from the base class
    }
    

    【讨论】:

      【解决方案6】:

      首选术语通常在很大程度上取决于语言,但我发现大多数 OO 开发人员无论使用何种术语都能相互理解。 (话虽如此,我绝对同意单词选择对于最大限度地提高沟通效率很重要。)

      我的首选术语是类的“子类”或“扩展”,以及接口的“实现”。 (在 Objective-C 中,“采用”或“符合”协议,这是 Java 接口的灵感来源。)我经常使用“父”和“子”来描述关系本身。

      我发现“is a”与“has a”(组合)对比时效果最好,但它并不适用于所有形式的继承 - 有时,缩小特异性是有意义的,但并非总是如此。同样,有时“派生”似乎并不正确——很多人会将其理解为专业化,但并非所有人都会。 (例如,一个人可以推导出一个证明,通过反应推导出化学物质等。查看该词的字典条目以查看各种可能的含义,其中许多与一组步骤有关,这听起来更像一种算法而不是继承。)在旁注中,我发现许多学者更喜欢“基类”和“派生类”,但在行业中可能不那么常见。

      【讨论】:

        【解决方案7】:

        我要在这里说简单是一件好事。当提到显然是父类 (B) 的一个实例的子类 (A) 时,我完全赞成“A Is a B”(A Dog 是 Mammal 等)。如果关系不是那么简单,我更愿意简单地说“A 是 B 的子类”。

        类组合显然使“A 是 B”的概念变得困难,因此显然有一段时间“A 有 B”或“A 拥有 B”更容易理解。

        为了简单起见,我更喜欢说一个类符合协议,或者实现一个接口(虽然我不怎么用 java 编程)。

        就我而言,关键是简单和易于沟通。如果您自己在做一个项目,并且永远不必与其他人讨论您的设计或代码,请随意调用它。如果您在一个团队中工作,建立尽可能简单的沟通标准可以省去很多麻烦,试图破译每个人对 OOP 模式的不同俚语。

        【讨论】:

          【解决方案8】:

          这是我更喜欢的术语:

          • A 继承自 B - 这是最简单最精确的方法。
          • A 派生自 B - 这对于一般描述 A 继承 B 或从 B 派生的其他类的情况很有用。

          这是我不喜欢的术语:

          • A 扩展 B - 这不太准确,因为一个类可以从另一个类派生,只是做不同的事情而不从字面上扩展它。也常用于描述接口之间的关系。
          • A 子类 B - 继承不仅限于类。
          • A 是 B - 如果 A 从 B 继承,则它不一定与 B 相同,除非它可以合法地用于任何可以使用 B 的地方。如果虚函数的design contract preconditions and postconditions在新类中没有得到适当的弱化和加强,A在技术上不是B,因为它违反了Liskov substitution principle

          【讨论】:

          • 但是,您可能会认为您的首选术语含糊不清。当您处理 2 个类时,“子类”和“超类”是正确的术语。你对“扩展”和“是一个”有很好的看法——它们不太合适。同样,“继承”很奇怪,因为它的语法很差。通常,人们会说“继承自”,因为它实际上并没有继承 B,它从 B 继承方法和变量。(好吧,够迂腐的头发分裂了。)
          • 将“继承”更改为“继承自”。
          【解决方案9】:

          我喜欢老派的说“A 暗示 B”或“A 小于 B”。它们不像其他术语那样模棱两可,即它们具有精确的含义。

          脚注:我有时说“优于”和“比”分别表示超类型和子类型关系。当不清楚所讨论的对象是类型时,我这样做是为了消除这种关系的歧义。我从 Edward Kmett 那里继承了这个习惯。

          See here.

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-10-12
            • 1970-01-01
            • 2012-02-21
            • 2015-05-29
            • 2018-12-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多