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

继承与不同的实例?

壤驷乐邦
2023-03-14

如果我为各种品牌的汽车建模,我会使用继承层次结构,还是仅仅改变构造函数参数?

关于是使用继承还是仅通过重复使用同一类来关联对象,一般的规则是什么?

对于汽车,我可以做一些像新车(“保时捷”、“991”、“3.8”)这样的事情,或者我可以有一个整体抽象的汽车超类,有像“保时捷”这样的抽象子类制造商,然后可能为保时捷的每个型号都有一个类?

共有3个答案

葛雨华
2023-03-14

单类方法的问题在于,对于所有不同类型的Cars,您都必须使用相同的实例变量和方法。

例如,汽车人可能有一个大多数其他汽车都没有的transform()方法。

我的意思是,理论上你可以为所有Cars定义transform()方法,让不支持它的汽车抛出异常。但这是一个比使用继承更混乱的设计。

继承也会让你做一些奇特的事情,比如多态性。例如,每辆车可能有一个parallelPark()方法。但更豪华的汽车可能有一个自动平行停车机制,这与所有其他汽车不同。在这种情况下,只需重写parallelPark()方法,Java就会选择正确的方法。

韩麒
2023-03-14

创建子类就是管理复杂性,并将问题分解为更小、更简单、不同且不重叠的情况。如果你必须为所有的汽车解决一些问题,你认为,这个问题对保时捷来说是“特别”的,因为他们有一个普通汽车没有的备用发动机,你可以创造一些类似的东西

PorscheCar : Car
{
    Engine engine;
    Engine backupEngine;
}
NonPorscheCar : Car
{
    Engine singleEngine;
}

因此,在您决定创建一个类来解决一个问题之后,如果您在该问题中检测到多个案例,并且您可以独立解决,那么您可以为每个案例创建一个子类。不使用子类就可以解决所有问题。问题是,如果在应该创建子类时不创建子类,我将很难正确管理和组织代码。

您必须小心选择每个对象或类解决的每个问题。如果您希望您的保时捷像保时捷和普通汽车一样打印,而没有*,这并不意味着保时捷“表现”不同,您需要创建一个特定的子类。实际上不同之处在于您打印保时捷的方式,因此您应该创建如下内容:

Car
{
    Brand brand;
}
CarPrinter
{
    Car carToPrint;
    static CreatePrinter(Car car)
    {
        return car.Brand() == PorscheBrand() ? new PorscheCarPrinter(car) : new DefaultCarPrinter(car);
    }
}
PorscheCarPrinter
{
    Print();
}
DefaultCarPrinter
{
    Print();
}

因此,问题分为两种情况,一种是打印汽车,另一种是为汽车本身建模。

以更抽象的方式,您应该创建一个类来建模域的每个概念。当您发现由该领域的特定概念建模和解决的责任是复杂的,并且您希望将其分成更小、不同和不重叠的情况时,那么您应该为每个较小的问题创建一个子类。

在你的特殊情况下,我不知道你的整个问题,但你不太可能需要为每个品牌的汽车创建子类,因为它们通常是一个单一的概念,只有一个案例需要解决。

司马越
2023-03-14

如果您有一些由所有汽车(或作用于对象的方法)共享的属性,然后每个make/model都有唯一的属性(或方法),那么您可能希望使用继承。否则,只需改变实例即可。

假设您希望所有汽车都具有这些属性:

  • 制造
  • 型号
  • 年份
  • 门的数量

在这种情况下,您不会想要创建一个类层次结构,因为它不会为您购买任何东西。

相反,如果您有两种“类型”的汽车:普通车和赛车,并且只有赛车可以启用一氧化二氮(可能是一种实现这一点的方法),那么您需要一个汽车类,并从中继承RegularCar和RaceCar。

如果您只是担心必须始终将相同的参数传递给构造函数,那么可以创建代表您调用构造函数的静态方法。这称为工厂方法模式

附言:我的例子真是太离谱了。但我希望你明白我想说的:)

 类似资料:
  • 问题内容: 假设Java具有以下层次结构类: 这是C#中相同代码的(盲)重复: 当我执行Java代码时,我得到了C#返回的信息。 对我来说,C#的结果更有意义,因为引用B调用了它自己的方法。 Java设计者决定打印而不是打印的逻辑是什么?我的意思是,为什么引用B在C中使用覆盖方法?这种方法的优势是什么? 如何更改Java代码以像C#一样打印出来?我的意思是,我怎么教Java调用它使用的完全引用的方

  • 问题内容: 偏重于继承而不是继承 是非常流行的短语。我读了几篇文章,最后每篇文章都说 当类之间存在纯IS-A关系时,请使用继承。 本文中的一个示例: 在 Apple 和 Fruit 之间存在明显的IS-A关系,即Apple IS-A Fruit,但作者也将其显示为Apple HAS-A Fruit(组成),以显示通过继承实现时的陷阱。 我在这里变得有些困惑,声明的含义是什么 当类之间存在纯IS-A

  • 问题内容: 假设我有两个班级:动物和狗。狗是动物的子类。我执行以下代码: 现在,我可以通过a变量来调用Dog类的方法。 但是我的问题是:如果我可以通过Dog对象(继承性)调用Animal的所有方法,那么为什么要使用多态原理呢?我可以声明: 通过此声明,可以使用所有Animal方法和Dog方法。那么为什么要使用多态呢?非常感谢您的回答。 问题答案: 在Java中,多态和继承的概念被“焊接在一起”。通

  • 在定义一个类时往往会使其继承某个父类或者实现某个接口,在扩展中实现这个功能非常方便。下面我先给出PHP语言中的代码。 <?php interface i_myinterface { public function hello(); } class parent_class implements i_myinterface { public function hello()

  • 本文向大家介绍C++多重继承与虚继承分析,包括了C++多重继承与虚继承分析的使用技巧和注意事项,需要的朋友参考一下 本文以实例形式较为全面的讲述了C++的多重继承与虚继承,是大家深入学习C++面向对象程序设计所必须要掌握的知识点,具体内容如下: 一、多重继承 我们知道,在单继承中,派生类的对象中包含了基类部分 和 派生类自定义部分。同样的,在多重继承(multiple inheritance)关系

  • 本文向大家介绍js对象继承之原型链继承实例,包括了js对象继承之原型链继承实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了js对象继承之原型链继承的用法。分享给大家供大家参考。具体分析如下: 其它说明:kitty也是有构造方法的,即new Object()。Object默认也有一些方法和属性,见javascript手册中的 "object对象"。同时,它也有原型,只是为空而已 { }。