当前位置: 首页 > 知识库问答 >
问题:

子类的局限性

仲阳朔
2023-03-14

例如,考虑具有“see”功能的类“man”,以及不应该具有该功能的子类“blindman”,但应该具有“man”所具有的所有其他功能。

我能想出的唯一解决方案是拥有一个抽象类“man”,以及两个子类“seeingman”和“blindman”,其中SeeinMan添加了一个函数“see”。

然而,这个解决方案的问题是,如果我现在想添加一个“Deafman”类-它扩展了什么?看见人?如果那个人又聋又瞎呢?

共有1个答案

东门晓博
2023-03-14

我认为在这种情况下,您应该使用组合而不是继承,或者使用组成Human的各种子类。

虽然我确实理解您的逻辑,但基类是一个契约,它保证该类型的所有类都应该遵守这种行为,拥有一个子类来移除父方法是一个很大的不不。

虽然您可以抛出各种异常,但我根本不会走这条路。这么想吧,假设我是一个只需要访问人类对象的开发人员,我期望某个行为,突然间我调用了一个接口方法,得到了…一个异常,仅仅因为我调用了它??您不应该知道派生类、实现以及何时可以调用或不可以调用它们。

以下是几个html" target="_blank">解决方案:

把人类变成一个基本的人类功能、视觉系统等的组成,那么盲人就只有其中的几个了。

class Human {
  private BasicHumanFunctions _basicFunctions; //contains breathe funcitonality.
  private VisionSystem _vision; //contains see
}

class BlindMan {
   private BasicHumanFunctions _basicFunctions;
}

使Human基类只包含所有人类想要的相同行为呼吸等,然后创建一个HealthyHuman和一个BlindHuman等,每一个都创建自己的方法。然后,您可以使用HealthHuman并在需要时进一步子类它。

class Human {
   void breathe() {};
   // other Human basic functions;
} 

class HealthyHuman extends Human {
   void see() {};
   //other healthy human functions
}

class BlindHuman extends Human {
  void useCane() {};
}
class BlindHuman extends Human {
   private VoiceSubsystem _voice = new VoiceSybsystem();
   void speaker() {  _voice.speaker();}
}
 类似资料:
  • 本文向大家介绍iOS 类别的局限性 ?相关面试题,主要包含被问及iOS 类别的局限性 ?时的应答技巧和注意事项,需要的朋友参考一下 有两方面局限性: (1)无法向类中添加新的实例变量,类别没有位置容纳实例变量。 (2)名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。类别方法将完全取代初始方法从而无法再使用初始方法。 无法添加实例变量的局限可以使用字典对象解决

  • Selenium的局限性主要如下: Selenium不支持桌面应用程序的自动化测试。 Selenium需要高技能才能更有效地自动化测试。 由于Selenium是开源软件,因此您必须依靠社区论坛来解决技术问题。 无法使用Selenium对Web服务(如SOAP或REST)执行自动化测试。 使用者应该至少知道或熟悉一种受支持的编程语言,以便在Selenium WebDriver中创建测试脚本。 它没有

  • 当前版本的SystemTap提供的探测内核空间事件的众多选项,可以在不同版本的内核下使用。然而,SystemTap对探测用户空间事件的支持依赖于内核的支持(需要utrace机制),而多数内核缺乏这一支持。结果是,仅有部分内核上的SystemTap版本支持用户空间探测。 当前,SystemTap社区正集中力量改进SystemTap的用户空间探测能力。 (译注:本指南写于2013年。现今的内核普遍已经

  • 我有一个由320个数组组成的数组,而常规的显示了包含所有嵌套元素的320个元素,Laravel的助手截断了索引147处的嵌套元素,并且截断了所有其他元素,没有扩展它们的选项,请参见下面的示例 为什么限制在147条全记录,如何提高限制?相关主题Laravels的DD助手函数是否正常工作?实际上并不能解释限制。 这是一个非常一致的行为,我已经用Laravel5.2和php7对其进行了测试 Linux(

  • 例如,我有一个Fruit和vitamin类的本体论。水果类只有橘子和香蕉为亚类,维生素类只有维他命C和维他命B为亚类。这些子类都是互不相交的。 我还提供了一个object属性,类Fruit作为域,类Vitamin作为范围。 然后,我定义了限制条件:“橘子提供一些维他命C”和“香蕉提供一些维他命B”。