Is-a,extends,'inherits':你对“继承”的首选术语是什么?为什么?

时间:2009-10-27 02:38:08

标签: language-agnostic inheritance terminology

一个主观的问题,因此,如果有投诉我会维基,但我想知道人们所采取的是几乎可互换的用于继承的不同术语。

我们有“是-a”,“扩展”,“派生”,“子类”,只是“继承”

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

引人注目!

9 个答案:

答案 0 :(得分:4)

我经常使用“A子类B”(非常直接)或“A继承自B”(适度地更加圆周)。 “extends”在Java这样的关键字的语言中很好,但是出于某种原因,将它用于(例如)C ++或Python似乎有点延伸。 “IS-A”是继承必须遵守的关系约束(Liskov的原则)并且在实例(左侧)和类(右侧)之间保持 - 所以你可以说“x IS-A Foo”(当x是一个实例时) Foo或Foo的任何子类),但是“Bar IS-A Foo”(它们都是类)似乎是错误的,它会导致混淆语言,其中类也是(meta)类的实例,如Python。

答案 1 :(得分:3)

我喜欢说派生,因为它强烈暗示了类/子类关系,但在更具异国情调的情况下,如多重继承,接口实现和mixin,将会相当准确。

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

答案 2 :(得分:1)

我被教导要考虑如果你可以在“A是B”(鲸是哺乳动物)关系之间连接到A和B类,那么它们就会受到继承的束缚。

所以我更喜欢IS A

答案 3 :(得分:1)

不同语言中有不同的终端。

“是一个”适合动态语言,并提升perl / php / python和javascript对象的嵌合特性。 Lassie是一只狗,是一种哺乳动物,是一种宠物,是一部电影明星,也是米高梅的资产。

“extends”适合Java的本质的声明性,严格类型(以及它缺乏多重继承!)。 “Lassie延伸狗”,Lassie可以走路和吠叫但是当她在Java中实施时不能出演或演出!

答案 4 :(得分:1)

有两种方法可以考虑继承:

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() );
}

extends - 一种捕获共享实现的方法。

public class iTouch
{
    // cool pda features
}

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

答案 5 :(得分:1)

以下是我更喜欢的术语:

  • A继承自B - 这是最简单的方法。
  • A派生自B - 这通常用于描述A继承B或来自B的其他类的情况。

这是我不喜欢的术语:

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

答案 6 :(得分:1)

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

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

我发现“is a”在与“has a”(组合)形成对比时效果最好,但它对所有形式的继承都没有意义 - 有时,缩小特异性是有道理的,但并非总是如此。同样,有些时候“派生”似乎并不正确 - 很多人会把它理解为专业化,但不是每个人都会理解。 (例如,人们可以得出一个证明,通过反应得出化学物质等。检查单词上的词典条目,看看各种可能的含义,其中许多与一组步骤有关,听起来更像一个算法而不是继承。)另一方面,我发现许多学者都喜欢“基类”和“派生类”,但在工业界可能并不常见。

答案 7 :(得分:1)

我在这里说简单是件好事。当引用子类(A)时,我全都是为了“A Is a B”,它显然是父类(B)的实例(A Dog是哺乳动物等)。如果关系不那么简单,我宁愿简单地说“A是B的子类”。

班级构成显然使“A Is a B”的概念变得困难,因此很明显“A有B”或“A拥有B”的时间更容易理解。

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

就我而言,关键是简单易用。如果您自己正在开展项目,并且永远不必与其他人讨论您的设计或代码,请随意调用它。如果你正在一个团队工作,建立最简单的沟通标准可以省去很多令人头痛的问题,试图解读每个人对OOP模式的不同俚语。

答案 8 :(得分:1)

我喜欢踢老派并说“A暗示B”或“A小于B”。这些并不像其他术语那样含糊不清,即它们具有精确的含义。

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

See here.