java - 扩展对象并继承所有变量

标签 java inheritance

假设我有一个 Car 类的对象,其中包含从最高速度到颜色的大约 30 个变量。我想制作一个 MyCar 对象(类 MyCar 扩展 Car),它基本上是相同的东西,只是它存储了更多信息。

我不可能立即创建 MyCar 对象(因为在成千上万的 Car 对象中只有少数会成为 MyCar 对象),除非我将其他字段留空,但这似乎不太专业。创建一个接受 30 个参数的构造函数,或通过方法调用设置 30 个参数,都不会。

那么,有什么方法可以轻松地从父类(super class)对象继承所有变量吗?

PS:我的程序不是关于汽车的,但我认为这是一个更简单的例子。

编辑

感谢您的回复。它们对我的程序都有帮助,但对这个特定问题没有帮助。 builder 似乎没有什么好处,因为我的这些车没有变量的默认值。每次制造汽车时,都会填写所有变量(构建一种“事实表”需要这些变量)。

信封是一个有趣的设计,但仍然需要我复制子类构造函数中的所有变量。我希望有办法避免这种情况。模板还需要我一个一个地复制所有变量。

在我的程序中,子类充当搜索引擎中的一种“包装器类”。子类别与普通汽车相同,但它们具有“排名分数”。我的程序旨在显示普通汽车,通过扩展它们,我可以轻松地显示子类并同时按分数对它们进行排序。

无论如何我都必须创建新对象,因为可以对同一个汽车列表执行多个搜索。因此,在原始汽车中编辑变量不是一种选择。

也许这个问题有更好的解决方案,但现在我想我必须将父类(super class)对象传递到构造函数中并将所有变量复制到那里。

感谢您的帮助!

PS:我在想,也许我可以把所有的变量都扔到一个HashMap中。这样我就可以使用 .get(varname) 访问它们,而且我只需将一个 HashMap 变量传递给子类。缺点是我必须进行大量转换,因为变量是字符串、整数、 double 等的混合体。您认为这种编码风格如何?

最佳答案

Effective Java 2nd Edition,第 2 条:面对许多构造函数参数时考虑构建器

And neither does creating a constructor which takes 30 arguments, or setting 30 arguments through method calls.

如果您面对的构造函数太多参数,那么您可能想看看:Builder Pattern . 这个想法是只将您想要/知道的字段设置到构建器中,而不用担心可选的字段,或者您想要使用的默认字段 值,然后调用 build() 来构造实际的对象。请参阅该文章中的 Java 示例。

一旦你设置了那个模式,你就可以用这种方式构造汽车(注意干净的结构):

Car car = new Car.Builder(required_param1, required_param2)
                 .color(RED) // optional params
                 .topSpeed(300)
                 .zeroToHundred(2)
                 .build();

关于java - 扩展对象并继承所有变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3275757/

相关文章:

java - 为什么 spring-data-mongodb 1.10 不支持 readConcern 选项?

java - 高负载应用程序的数据库可扩展性?

c++ - C++中如何继承模板类?

java - 如何从 Java 中的 SOAP 响应中提取数据?

java - hibernate 可选择不自动递增 ID 字段

java - 公共(public)代码消除在进行 JIT 时会优化这种双重检查吗?

c++ - 为什么不能将继承的 protected 构造函数公开?

c++ - 父类(super class)可以继承子类的方法吗?

Javascript 命名空间

java - 深度复制具有不同类的多维对象数组的正确方法