“is A” VS “is Like A”关系,每种关系的含义是什么以及它们有何不同?

2024-04-12

首先举个例子来讨论:

class Foo
{
    // Attributes:
    int attribute1, attribute2;

    // Methods:
    virtual void Foo1()
    {   /* With or without Implementation   */  }
    virtual void Foo2()
    {   /* Also with or without Implementation */ }
};

class ExactDuplicate: Foo   // No New Attributes or Methods
{   
    virtual void Foo1()
    {   /* A new Implementation */  }

    // Also there might be new Implementations to other methods
};

class ExtraMethods: Foo     // Having New Methods
{
    virtual void Foo3()
    {   /* Implementation   */  }
};

class ExtraAttributes: Foo  // Having New Attributes
{
    int attribute3;
};

我和我的老师讨论了“is A”和“就像A“关系以及它们有何不同。

我的想法(我在某个地方读过,我不记得了)是“is A“关系是在父类和从其继承的子类之间,并且它不受添加新方法或属性的影响,因此来自子类的任何实例”is A" 父类,在上面的例子中,每个ExactDuplicate, ExtraMethods, or ExtraAttributes "is A" Foo。虽然“就像A" 关系是继承自同一个 Parent 类的两个 Child 类之间的关系,在上面的示例中,每个ExactDuplicate "is Like" every ExtraMethods or ExtraAttributes,反之亦然。

我的老师的意见那是“is A“关系是在父类和子类之间,子类不添加任何额外的方法或属性,所以在上面的例子中只有一个”is A“ 之间的关系Foo and ExactDuplicate。虽然“就像A”关系是父类和添加额外方法或属性的子类之间的关系,因此在上面的示例中,有一个“就像A“ 之间的关系Foo和每个ExtraMethods and ExtraAttributes.

我认为,“is A“我的老师定义的关系并不是真正有用,因为在大多数情况下,如果不添加任何内容,就没有理由更改实现。这是一点。另一个,Car "不像" Vehicle,实际上是“is A" Vehicle,同时一个Van "就像A" Car,因为两者都关联了一些特征。

那么哪个是正确的,为什么?,我非常感谢解释。

另外,如果我老师的意见是正确的,那么仅添加属性是否会使关系成为“就像A“关系,或者需要添加新的方法才能成为”就像A“关系?子类之间的关系是什么(如果存在)。

希望我的问题是清楚易懂的。

任何帮助将不胜感激 :)


由于这些术语通常被使用,你是对的,你的老师是错的。

Is-A 确实允许扩展。子级可以具有父级不允许的属性、操作等。从 OOP 的角度来看,关键点是可以使用子实例来代替父实例。any(编辑:是的,我可能应该提到的是所谓的里氏替换原则,通常缩写为 LSP,以其创始人芭芭拉·里斯科夫(Barbara Liskov)命名)。

Is-like-A 主要用于描述错误——举一个明显的例子,当有人试图从矩形继承正方形时(反之亦然)。两者都不是对方的真正延伸,因为两者都不具有对方的所有特征。两者都不应该从另一个继承,因为可能存在一种情况,用一个替代另一个不起作用(提议的孩子不符合成为父母的要求)或可能破坏某些东西(父母允许的更改)会破坏孩子的不变量)。

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

“is A” VS “is Like A”关系,每种关系的含义是什么以及它们有何不同? 的相关文章

  • 无法在 C++ 中使用宏定义类

    我想生成许多几乎没有什么区别的子类 所以我想使用宏来简化我的工作 宏定义如下 define DECLARE SUB CLASS sub class name base class name value1 class sub class na
  • 如何处理特定类型集合的操作?

    在我的申请中的几个不同地方 我需要采取Seq SalesRow 并返回一个Map String SalesRow 其中字符串是国家 地区的名称 我需要在几个地方使用它 例如 我获取所有 SalesRows 的列表 并获取按国家 地区划分的全
  • 绘制java类的依赖关系图

    嘿嘿 我正在寻找像 JDepend 这样的工具来为 java 类文件绘制图表 JDepend 看起来很好 但它没有从 deps 中解析 deps 也许我只是缺少一些特殊选项 直接输出为 dot 格式或图像会很好 谢谢 你可以试试Java依赖
  • Erlang 参与者与 OOP 对象有何不同?

    假设我有一个 Erlang actor 定义如下 counter Num gt receive From increment gt From self new value Num 1 counter Num 1 end 同样 我有一个 Ru
  • 如何*真正*编写 UML 基数?

    我想一劳永逸地知道如何编写 UML 基数 因为我经常不得不争论它们 所以非常欢迎证明和来源 如果我想解释一下a Mother可以有几个Children but a Child有且仅有一个Mother 我应该写 Mother 1 Child
  • John Resig 的 Javascript 继承片段是否已弃用?

    我正在寻找一种简单的方法来创建两个类 一个类继承另一个类 子类重新定义父类的方法之一 并在新方法中调用父类的方法 例如 有一个班级Animal and Dog 其中 Animal 类定义了一个方法makeSound 它建立了如何输出声音 然
  • 无法构建具有 int 输入的 Keras 层

    我有一个复杂的 keras 模型 其中一层是自定义预训练层 需要 int32 作为输入 该模型作为继承自 Model 的类实现 其实现如下 class MyModel tf keras models Model def init self
  • 如何重构“字符串类型”代码?

    我目前正在开发一个代码库 其中有几类变量 例如数据库路径 它们简单地表示为字符串 这些 非 类型的大多数操作都在实用程序类中定义 我创建了一个新类来表示数据库 并将操作定义为实例方法 采用传统的 OOP 风格 然而 浏览大型代码库并重构它以
  • 为什么 Swift 中委托方法需要公开?

    我正在快速开发一个框架 我正在创建一个处理框架中 BLE 内容的类 这个类应该是公共的 因为我需要从使用我的框架的外部应用程序访问这个类 我的班级结构如下 public class MyClass NSObject CBCentralMan
  • 带参数和不带参数的 super() 有什么区别?

    我遇到了一个使用的代码super 方法有两种不同的方式 我不明白逻辑上有什么区别 我现在正在学习pygame模块 我有一个任务来创建一个类Ball它继承自Sprite这是一个来自pygame模块 如果我没记错的话 我遇到了这段代码 impo
  • 接口实现中的非接口方法

    我有一个定义方法的接口 我有一个结构实施这个界面 在其中 我实现了该接口中的方法 并且还定义了其他方法 例如 package main import fmt type Animal interface MakeNoise type Dog
  • 在 Actionscript 3 中实现单例模式类的最佳方法是什么?

    由于 AS3 不允许私有构造函数 因此构造单例并保证构造函数不是通过 new 显式创建的唯一方法是传递单个参数并检查它 我听说过两个建议 一个是检查调用者并确保它是静态 getInstance 另一个是在同一包命名空间中拥有一个私有 内部类
  • 尝试在类中定义静态常量变量

    我正在定义一个变量adc cmd 9 as a static const unsigned char在我的课堂上ADC私人之下 由于它是一个常量 我想我只需在它自己的类中定义它 但这显然不起作用 pragma once class ADC
  • 如何在基类中声明类似工厂的方法?

    我正在寻找 C 类设计问题的解决方案 我想要实现的是在基类中拥有静态方法方法 它将返回后代类型对象的实例 关键是 其中一些应该是单身人士 我正在用VCL编写它 所以有可能使用 properties 但我更喜欢纯 C 解决方案 class B
  • 我应该将 PHP include/require 语句放在 HTML 中的什么位置?

    我在文件中创建了一个 PHP 类 现在我想在 HTML 页面中使用它 我应该把它放在哪里require or includeHTML 页面内的声明 有没有表现在 HTML 的开头或结尾加载它之间的区别 还是根本没有区别 应该是在 PHP 脚
  • Java 递增/递减运算符 - 它们的行为方式是什么,功能是什么?

    开始学习Java已经三天了 我有这个程序 但我不明白其中的代码main方法与 and 运营商 我什至不知道该怎么称呼他们 这些操作员的名字 谁能给我解释一下这是怎么回事 class Example public static void ma
  • 如何在 Lua 中实现 OO?

    Lua 没有内置对 OO 的支持 但它允许您自己构建它 您能否分享一些实现面向对象的方法 请为每个答案写一个例子 如果您有更多示例 请发布另一个答案 我喜欢将 OOP 视为容器 对象 内的数据封装以及可以使用该数据完成的操作子集 还有很多内
  • 向元素添加类

    像这样 我有两个选项卡 所以当我单击其中一个选项卡时 它是活动的 逻辑的 现在我试图区分活动选项卡和非活动选项卡 但不是使用 css 属性 但我想向单击的选项卡添加特定的类 如下所示 tab1 addClass active 但是 没有什么
  • 如何使用工厂来创建使用策略模式的对象?

    假设我们的在线商店有一个简单的支付功能 我们希望使用不同的交易处理器来管理不同的交易 交易可以是付款或退款 交易处理器可以是 Paypal 或 Payplug 所以我们有以下课程 class PaymentTransaction imple
  • 如何在 Windows 上使用 Pyreverse

    我想使用pyreverse 创建图表类 我下载它 当我使用这个命令时 pyreverse bat c PyreverseCommand a1 s1 f ALL o png test py 我收到错误 名称 点 无法识别 什么是 点 如何创建

随机推荐