为什么要使用继承? [关闭]

2024-04-27

我知道问题是之前讨论过 https://stackoverflow.com/questions/49002/prefer-composition-over-inheritance,但似乎总是假设继承至少有时比组合更可取。我想挑战这个假设,希望获得一些理解。

我的问题是这样的:Since你可以通过对象组合完成任何你可以通过经典继承完成的事情自从经典继承经常被滥用[1]自从对象组合使您可以灵活地更改委托对象运行时,为什么你会ever使用经典继承?

我可以理解为什么您会建议使用某些语言(例如 Java 和 C++)进行继承,因为这些语言不提供方便的委托语法。在这些语言中,只要没有明显错误,就可以通过使用继承来节省大量输入。但其他语言(例如 Objective C 和 Ruby)都提供经典继承and非常方便的委托语法。据我所知,Go 编程语言是唯一一种认为经典继承麻烦大于其价值并且仅支持代码重用委托的语言。

陈述我的问题的另一种方式是这样的:即使您知道经典继承对于实现某个模型来说并不是不正确,但是这个理由是否足以使用它而不是组合?

[1] 许多人使用经典继承来实现多态性,而不是让他们的类实现接口。继承的目的是代码重用,而不是多态。此外,有些人使用继承来模拟他们对“is-a”关系的直观理解这通常会出现问题 http://en.wikipedia.org/wiki/Circle-ellipse_problem.

Update

我只是想澄清一下当我谈论继承时我的确切含义:

我正在谈论类从部分或完全实现的基类继承的继承类型 http://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming). I am not谈论从纯粹的抽象基类继承,这与实现接口是一样的,我郑重声明,我并不反对这一点。

Update 2

我知道继承是C++实现多态性的唯一方法。在这种情况下,很明显为什么你必须使用它。所以我的问题仅限于 Java 或 Ruby 等语言,它们提供了实现多态性的不同方法(分别是接口和鸭子类型)。


[注意:这个问题最初被标记为与语言无关。基于此,这个答案的编写与语言无关,因此它讨论了在多种语言(例如 Smalltalk、C++ 和 Object Pascal)中使用的继承。此后它被重新标记为专门针对 Java。 Java 的不同之处在于定义class and an interface作为两个完全独立的事物。继承的目的是代码重用而不是多态性的想法从特定于 Java 的角度来看是合理的,但从与语言无关的角度来看显然是错误的。如果您只关心 Java,这可能不是最好的答案。]

继承的目的是代码重用,而不是多态。

这是你的根本错误。事实几乎恰恰相反。这primary(公共)继承的目的是对相关类之间的关系进行建模。多态性是其中很大一部分。

如果使用正确,继承并不是重用现有代码。相反,它是关于被使用by现有代码。也就是说,如果您有可以与现有基类一起使用的现有代码,那么当您从现有基类派生一个新类时,其他代码现在也可以自动与您的新派生类一起使用。

可以使用继承来重用代码,但是当/如果您这样做时,通常应该是private继承不是公共继承。如果您使用的语言很好地支持委派,那么您很可能没有太多理由使用私有继承。 OTOH,私有继承确实支持委托(通常)不支持的一些功能。特别是,尽管多态性在这种情况下绝对是次要问题,但它can仍然是一个问题——即,通过私有继承,您可以从基类开始almost你想要什么,并且(假设它允许)覆盖不太正确的部分。

对于委派,您唯一真正的选择是完全按原样使用现有类。如果它没有达到您想要的效果,您唯一真正的选择就是完全忽略该功能,并从头开始重新实现它。在某些情况下,这并不算什么损失,但在其他情况下,损失却相当可观。如果基类的其他部分使用多态函数,则私有继承允许您重写only多态函数,其他部分将使用您重写的函数。通过委派,您无法轻松插入新功能,因此现有基类的其他部分将使用您已覆盖的功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么要使用继承? [关闭] 的相关文章

  • 使用 JPA Criteria API 进行分页的总行数

    我正在系统中为实体实现 高级搜索 功能 以便用户可以使用该实体的属性上的多个条件 eq ne gt lt 等 来搜索该实体 我正在使用 JPA 的 Criteria API 动态生成 Criteria 查询 然后使用setFirstResu
  • Java:如何从转义的 URL 获取文件?

    我收到了一个定位本地文件的 URL 事实上我收到的 URL 不在我的控制范围内 URL 按照 RFC2396 中的定义进行有效转义 如何将其转换为 Java File 对象 有趣的是 URL getFile 方法返回一个字符串 而不是文件
  • org.apache.sling.api.resource,version=[2.3,3) -- 无法解析

    您好 我无法访问我的项目内容 我已经上传了从 CQ 访问内容所需的所有包 我唯一能看到的是 org apache sling api resource version 2 3 3 无法解析 这是否是异常的原因 如果是 请告诉我如何解决 中Q
  • OpenCV 中的 Gabor 内核参数

    我必须在我的应用程序中使用 Gabor 过滤器 但我不知道这个 OpenCV 方法参数值 我想对虹膜进行编码 启动 Gabor 过滤器并获取特征 我想对 12 组 Gabor 参数值执行此操作 然后我想计算 Hamming Dystans
  • 使用 AES SecretKey 的 Java KeyStore setEntry()

    我目前正在 Java 中开发一个密钥处理类 特别是使用 KeyStore 我正在尝试使用 AES 实例生成 SecretKey 然后使用 setEntry 方法将其放入 KeyStore 中 我已经包含了代码的相关部分 The KS Obj
  • 在 S3 中迭代对象时出现“ConnectionPoolTimeoutException”

    我已经使用 aws java API 一段时间了 没有遇到太多问题 目前我使用的是库 1 5 2 版本 当我使用以下代码迭代文件夹内的对象时 AmazonS3 s3 new AmazonS3Client new PropertiesCred
  • Hazelcast 分布式锁与 iMap

    我们目前使用 Hazelcast 3 1 5 我有一个简单的分布式锁定机制 应该可以跨多个 JVM 节点提供线程安全性 代码非常简单 private static HazelcastInstance hInst getHazelcastIn
  • hibernate锁等待超时超时;

    我正在使用 Hibernate 尝试模拟对数据库中同一行的 2 个并发更新 编辑 我将 em1 getTransaction commit 移至 em1 flush 之后我没有收到任何 StaleObjectException 两个事务已成
  • 匿名类上的 NotSerializedException

    我有一个用于过滤项目的界面 public interface KeyValFilter extends Serializable public static final long serialVersionUID 7069537470113
  • Calendar.getInstance(TimeZone.getTimeZone("UTC")) 不返回 UTC 时间

    我对得到的结果真的很困惑Calendar getInstance TimeZone getTimeZone UTC 方法调用 它返回 IST 时间 这是我使用的代码 Calendar cal Two Calendar getInstance
  • 具有 java XSLT 扩展的数组

    我正在尝试使用 java 在 XSLT 扩展中使用数组 我收到以下错误 Caused by java lang ClassCastException org apache xpath objects XObject cannot be ca
  • 使用 SQLITE 按最近的纬度和经度坐标排序

    我必须获得一个 SQLite SQL 语句 以便在给定初始位置的情况下按最近的纬度和经度坐标进行排序 这是我在 sqlite 数据库中的表的例句 SELECT id name lat lng FROM items EXAMPLE RESUL
  • 编辑文件名在 JComboBox 中的显示方式,同时保持对文件的访问

    我对 Java 很陌生 对堆栈溢出也很陌生 我正在尝试利用 JMF API 创建一个用 Java 编码的简单媒体播放器 到目前为止 我已经能够设置一个简单的队列 播放列表来使用JComboBox called playListHolder
  • 如何在selenium服务器上提供自定义功能?

    我知道可以通过某种方法获得一些硒功能 其中之一如下 driver getCapabilities getBrowserName 它返回浏览器名称的值 但如果它指的是一个可用的方法 如果我没有误解的话 这似乎与自定义功能有关 就像我的意思是
  • Javafx过滤表视图

    我正在尝试使用文本字段来过滤表视图 我想要一个文本字段 txtSearch 来搜索 nhs 号码 名字 姓氏 和 分类类别 我尝试过在线实施各种解决方案 但没有运气 我对这一切仍然很陌生 所以如果问得不好 我深表歉意 任何帮助将不胜感激 我
  • Jersey 客户端请求中未设置 Content-Length-Header

    我正在使用 Jersey Client 访问网络服务 如下所示 response r accept MediaType TEXT PLAIN TYPE header content length 0 post String class 其中
  • Netty:阻止调用以获取连接的服务器通道?

    呼吁ServerBootstrap bind 返回一个Channel但这不是在Connected状态 因此不能用于写入客户端 Netty 文档中的所有示例都显示写入Channel从它的ChannelHandler的事件如channelCon
  • 如何从父类中获取子类名

    我试图在不需要子类上的函数的情况下完成此任务 这可能吗 我有一种感觉 但我真的很想确定
  • 为什么这个作业不起作用?

    我有课Results which extends ArrayList
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu

随机推荐

  • 如何向我的 Android 应用程序授予系统权限?

    我正在实现一个从设备上静默卸载应用程序的演示 在 adb shell 中 我可以使用 pm uninstall packagename 来执行任务 但是当我编写代码时 我收到了一些权限被拒绝的错误 我已经用谷歌搜索了一段时间 发现要获得 D
  • 在 JPanel 与 JComponent 中绘图

    我需要一些帮助来理解为什么 JComponent 与 JPanel 中的绘图工作方式不同 import java awt Color import java awt Graphics import java awt Graphics2D i
  • 跨平台移动应用程序开发框架如何工作?

    Rhodes Phonegap 和 Appcelerator 如何采用 Javascript 或 Ruby 并将它们编译成应用程序 SDK 的二进制文件 而这些应用程序 SDK 通常需要使用 Obj C Java 和其他语言编写应用程序 A
  • 实体框架,将视图映射到表

    我有一个基本视图 它返回与表相同的列 给出或获取 1 个字段 在我的 DAL 代码中 我返回 MyTableObject 的列表 但在某些情况下 我将调用视图返回相同的数据 但来自不同的源 List
  • Titanium 创建图像文件:file.write(blob) 未创建正确的文件

    我正在尝试使用 Titanium 1 8 1 读取 PNG 文件 这是我读取文件的代码 var f Ti Filesystem getFile Ti Filesystem resourcesDirectory KS nav views pn
  • Cython 中的抽象类(具有纯虚方法)

    快速版本 如何在 Cython 中声明抽象类 目标是只声明接口 以便其他类可以继承它 必须有没有实施这个班级的 接口 pxd cdef class IModel cdef void do smth self impl pyx from in
  • 使用 Sethi-Ullman 算法的表达式的代码生成器

    Give a AST tree http en wikipedia org wiki Abstract syntax tree 我想生成一种类似汇编的语言 我正在尝试使用塞西 乌尔曼 http en wikipedia org wiki S
  • 使用 NSPredicate 过滤 NSArray

    我想过滤一个数组User对象 User has fullname user id和一些更多的属性 根据firstName or lastName以一些字符串开头 我知道如何根据一种条件进行过滤 NSPredicate predicate N
  • 将jquery日期选择器集成到jsf中

    我正在关注这些例子here http jqueryui com demos datepicker icon trigger and here http jqueryui com demos datepicker icon trigger但我
  • 可以制作一个不调用Intent的Android通知吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何对表中的每一行运行特定的sql查询?

    所以我的数据库中有两个表 它们看起来都是这样的 通讯 拨打电话 Timestamp FromIDNumber ToIDNumber GeneralLocation 2012 03 02 09 02 30 878 674 Grasslands
  • 成员函数什么时候应该有 const 限定符,什么时候不应该有?

    大约六年前 一位名叫 Harri Porten 的软件工程师写道本文 http www froglogic com porten const html 提出这样的问题 成员函数什么时候应该有 const 限定符 什么时候不应该有 我发现这是
  • 查找最近的城市,例如 oodle.com

    因此 我正在尝试开发一个显示用户列表的应用程序 该网站应该检测用户位置 我为此使用 maxmind api 然后显示用户位置 用户指定半径内的城市的列表 我该怎么做呢 MaxMind API 让我可以通过 IP 地址检测用户的城市 但如何找
  • dprintf 与 break + 命令 + continue 之间有什么区别?

    例如 dprintf main hello n run 生成与以下内容相同的输出 break main commands silent printf hello n continue end run 使用是否有显着的优势dprintf ov
  • C# 中的嵌入字体

    我已经尝试了很多在 c 中的 wpf 应用程序中嵌入字体的方法 该字体的名称是 Roboto 文件名是机器人 ttf如果那有用的话 我已确保它已在程序集中编译 那么如何在a中应用字体TextBlock例如 您可以将字体应用到如下元素中
  • 在插入模式下移至行首

    我知道我可以使用 Home in insert mode Esc i to exit insert mode and enter it again effectively going to the beginning of line But
  • 如何使用 devise_invitable 发送自定义邀请

    我是 ruby 新手 使用 devise invitable gem 进行邀请 每条指令都正确发送 现在我想添加一个自定义主题 该主题将具有受邀者姓名和董事会名称以及与主题相同的自定义内容 我如何在以下操作方法中执行此操作而不使用额外的自定
  • git log --oneline --graph 输出的含义

    我正在学习相对提交引用并尝试理解以下内容git log oneline graph课程中提供的输出 在课程中它说给定的 HEAD 指向9ec05ca提交 HEAD 意思是曾祖父母提交 是0c5975a犯罪 但在我看来4c9749e如果每个
  • 如何将H2数据库文件存储到项目目录中

    当我使用H2数据库时 数据库文件存储在C Users MyName TestDataBase db目录 H2路径是jdbc h2 TestDataBase 这是默认的 H2 数据库路径 是否有可能像这样将 H2 数据库文件存储到我的项目目录
  • 为什么要使用继承? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi