假设我有一个 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/