Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop OO编程中的子类型和继承有什么区别?_Oop_Computer Science - Fatal编程技术网

Oop OO编程中的子类型和继承有什么区别?

Oop OO编程中的子类型和继承有什么区别?,oop,computer-science,Oop,Computer Science,我找不到主要的区别。我很困惑什么时候可以使用继承,什么时候可以使用子类型。我找到了一些定义,但不是很清楚 在面向对象编程中,子类型和继承有什么区别?如果您在C++中私下继承,则继承没有子类型。也就是说,考虑到: class-Derived:Base//注意在Base之前缺少public 你不能写: Base*p=new-Derived();//类型错误 因为Derived不是Base的子类型。您只继承了实现,而不是类型。继承是关于获取超级类型的属性(和/或功能)。例如: class Base

我找不到主要的区别。我很困惑什么时候可以使用继承,什么时候可以使用子类型。我找到了一些定义,但不是很清楚


在面向对象编程中,子类型和继承有什么区别?

如果您在C++中私下继承,则继承没有子类型。也就是说,考虑到:

class-Derived:Base//注意在Base之前缺少public
你不能写:

Base*p=new-Derived();//类型错误

因为
Derived
不是
Base
的子类型。您只继承了实现,而不是类型。

继承是关于获取超级类型的属性(和/或功能)。例如:

class Base {
    //interface with included definitions

}

class Derived inherits Base {
    //Add some additional functionality.
    //Reuse Base without having to explicitly forward
    //the functions in Base
}
在这里,
派生的
不能用于预期的
,而是能够在添加行为或更改
行为的某些方面时,类似于
。通常,
Base
将是一个小的助手类,它为一些常见的功能提供接口和实现

子类型多态性是关于实现一个接口,因此能够在运行时替换该接口的不同实现:

class Interface {
    //some abstract interface, no definitions included
}

class Implementation implements Interface {
    //provide all the operations 
    //required by the interface
}
这里,只要需要
接口
,就可以使用
实现
,并且可以在运行时替换不同的实现。其目的是使使用
接口的代码更广泛地有用


你的困惑是有道理的。java、C++和C++都把这两个概念合并成一个类层次结构。然而,这两个概念并不完全相同,而且确实存在将这两个概念分开的语言。

一位亲戚不幸去世,把他的书店留给了你

你现在可以阅读那里的所有书籍,出售它们,你可以查看他的账户、客户名单等。这是继承,你拥有亲戚拥有的一切。继承是代码重用的一种形式

您也可以自己重新打开书店,承担亲戚的所有角色和责任,即使您添加了一些自己的更改-这是子类型-您现在是书店老板,就像您的亲戚过去一样

子类型是OOP的一个关键组件-您有一个类型的对象,但它满足另一个类型的接口,因此它可以在其他对象可能使用的任何地方使用


在你的问题中列出的语言-C++,java和c ^ -这两个(几乎)总是一起使用,因此从某种东西继承的唯一方法是对它进行子类型化,反之亦然。但是其他语言不一定会融合这两个概念。

除了已经给出的答案之外,我认为有一篇文章的答案是相关的。 摘录:

在面向对象的框架中,继承通常作为一种特性来表示,当人们在类的层次结构中组织抽象数据类型时,继承与子类型一起出现。然而,这两个概念是正交的

  • 子类型是指接口的兼容性。类型
    B
    A
    的子类型,如果可以在类型
    A
    的对象上调用的每个函数也可以在类型
    B
    的对象上调用
  • 继承指的是实现的重用。如果
    B
    的某些函数是根据
    A
    的函数编写的,则类型
    B
    继承自另一类型
    A
然而,子类型化和继承不需要同时进行。考虑数据结构DEQE,一个双端队列。deque支持两端插入和删除,因此它有四个功能
插入前端
删除前端
插入后端
删除后端
。如果我们只使用
insert-rear
delete-front
就得到了一个正常的队列。另一方面,如果我们只使用
insert front
delete front
,我们就会得到一个堆栈。换句话说,我们可以根据Deque实现队列和堆栈,因此数据类型、
Stack
Queue
继承自
Deque
。另一方面,
Stack
Queue
都不是
Deque
的子类型,因为它们不支持
Deque
提供的所有功能。实际上,在这种情况下,
Deque
Stack
Queue
的子类型


我认为java、C++、C语言及其ILK已经造成了混淆,正如已经指出的那样,它们把两个概念合并到一个类层次中。然而,我认为上面给出的例子以一种与语言无关的方式公正地表达了这些想法。我相信其他人可以给出更多的例子。

子类型不必通过继承来实现。某些非继承的子类型:

  • 围棋界面

  • 简单地说:子类型和继承都是多态性(继承是动态多态-覆盖)。实际上,继承是子类化的,这意味着在继承中,不保证子类具有超类的能力(确保子类不放弃超类行为),而是子类型化(例如实现接口和…),确保该类不会放弃预期的行为。

    您在哪里看到他们被描述为不同?@JonSkeet-这里的答案都错了吗/@国家知识产权局:虽然不一定是错的,但我认为如果OP包含了一些背景(4年前…),它会成为一个更好的问题。@JonSkeet-So。。。有区别吗?我刚才遇到了这个问题…@Sipo:老实说,我认为它们在不同语言之间的使用有点不一致。从技术上讲,你仍然会得到分型智慧