Java类和子类逻辑

Java类和子类逻辑,java,logic,structure,Java,Logic,Structure,我正在学习Java类,我想到了这个例子: 比如说,我正在开发一个可以创造汽车的应用程序。每辆车都由发动机、轮胎等部件组成。。。每个部件在某些方面都会给汽车带来动力,例如发动机会加速 为了发展这一点,我想我可以建立一个类汽车,它有一些变量来保存汽车配备的部件。然后,我创建了一个基类组件,它拥有所有组件的共同特征—它们的重量、大小。。。和一些泛型函数。然后,我创建了Components类的一些子类,这些子类定义了一个特定的组件,例如,我创建了Engines或Tires类。 当然,每个引擎可以是不同品

我正在学习Java类,我想到了这个例子:

比如说,我正在开发一个可以创造汽车的应用程序。每辆车都由发动机、轮胎等部件组成。。。每个部件在某些方面都会给汽车带来动力,例如发动机会加速

为了发展这一点,我想我可以建立一个类汽车,它有一些变量来保存汽车配备的部件。然后,我创建了一个基类组件,它拥有所有组件的共同特征—它们的重量、大小。。。和一些泛型函数。然后,我创建了Components类的一些子类,这些子类定义了一个特定的组件,例如,我创建了Engines或Tires类。 当然,每个引擎可以是不同品牌的宝马、奥迪。。。每个品牌都有不同的特点,比如说奥迪的发动机比宝马的加速快

现在的问题是,我是否必须为每个品牌引擎创建不同的子类?我当然可以,但这是建造这类建筑的正确方法吗


例如,在我构建了所有类之后,我注意到我必须为所有引擎添加另一个特性,例如最大速度,我必须更改每个特定品牌引擎的所有子类,但这听起来不是很有效。

经验法则是:如果有不同的行为,则需要单独的类


例如:发动机的性能与轮胎不同,但奥迪发动机的性能与宝马发动机相同,只是加速度的属性量不同,这是一种配置,而不是性能。

如果差异可以用同一数据属性的不同值表示,并且不需要不同的代码路径来处理这些值,那么您就不需要为它们提供单独的子类

例如,如果您正在计算0-60,您将有一个通用公式,您可以在其中插入特定发动机的加速度参数。不需要单独的AudiEngine和BMWEngine类

OTOH,如果奥迪发动机具有使汽车隐形的附加功能,那么您确实需要一个特殊的AudienEngine类,上面有一个特殊的enableInvisibility方法


经验法则:如果您发现自己正在编写if/else块来检查对象类型并相应地执行不同的操作,那么您需要子类。

我认为您可以使用多态性和继承。例如,您创建了一个SLINIC类-每个SLINIC都有相同的变量brand、power等。。然后,在调用类构造函数时,您可以初始化变量并将其赋值给BMW、130等。 这完全取决于应用程序的工作方式。
如果这不是您想要的答案,请指定问题,我将尽力提供帮助。

您的思路是正确的,但您遇到了所有设计师都面临的决策,并且没有明确的答案

但要扩展,您可以具体定义行为。。例如,你可以从你的基础级汽车开始。然后您可以定义一个接口,例如:

interface driveable
{
     void drive(engine type_of_engine, tire type_of_tire);
}

interface moddable
{
    void tune(exhuast type_of_exhaust);
}
然后是汽车:


你需要决定作为宝马或奥迪发动机是否有某种固有的东西,这是一种固有的发动机——宝马,或者品牌是否只是这台发动机拥有的一段数据——一个品牌,其价值是宝马。你走哪条路取决于你想让你的应用程序做什么。谢谢,我会记住你的经验法则,我对编程非常陌生,而且我在自学,所以我觉得这样的规则非常有用。现在,我认为所有的引擎都有动力或加速等特性,但是,按照我的例子,奥迪发动机可以有一个额外的功能,例如降低油耗,宝马发动机可以有另一个典型的功能。我想我可以在另一个类函数中编写这些功能函数,然后我可以在Engines类中创建一个新参数,该参数包含一种与每个引擎的额外功能相关的唯一代码。这是一个好方法吗?或者最好为每个特定的引擎创建一个类,并编写额外的功能函数?不,任何引擎都会消耗大量的资源。多少钱又是一个配置。如果一种发动机类型的气体输入和转速之间的关系是线性的,而另一种发动机类型的气体输入和转速之间的关系是指数的,则会出现不同的情况。好的,在液体消耗的情况下,我可以使用线性关系,但这只是一个示例。我指的是发动机的一个特性,所以任何发动机都有一个功能:它消耗气体或电来产生热量和旋转。没有空间容纳功能。因此,发动机是一个很糟糕的例子。谢谢你的回答,我喜欢你的例子,因为我发现它非常模块化。当然,我不是在开发我所描述的应用程序,我只是想了解未来项目的逻辑。谢谢你的回答,它帮助我了解了更多关于课程背后的逻辑。然而,正如我在另一篇评论中所说的:现在,我认为所有的发动机都有诸如功率或加速度之类的特性,但是,接下来呢
例如,奥迪发动机可以有一个额外的功能,例如降低油耗,宝马发动机可以有另一个典型的功能。我想我可以在另一个类函数中编写这些功能函数,然后我可以在Engines类中创建一个新参数,该参数包含一种与每个引擎具有的额外功能相关的唯一代码[…][…]我考虑过这一点,因为有时候一个类有很多数据和函数可以在子类中使用,这些子类只针对一个/几个特定的函数而不同,并且可能创建这样类似的类会使代码的结构不那么容易理解/mantain。减少燃料消耗是一个实际的功能,即您可以调用的功能,或者只是一些积极的特征,即比其他发动机少汽油里程?这是我可以调用的东西。您的示例enableInvisibility显然更好。感谢您的回答,我认为如果我这样做,我会将品牌名称值分配给类的字符串参数。这当然是获得我想要的结果的一种方式,但我不知道这是否是最好的选择。当然,这也取决于申请的目的。
class car : driveable
{
    void drive(...)
}

class bmw : car {...}
class audi : car, moddable {...}