gpt4 book ai didi

java - 具体的Java继承查询 - 需要建议

转载 作者:行者123 更新时间:2023-12-01 17:15:59 25 4
gpt4 key购买 nike

我遇到的问题非常具体,而且有点难以解释。如果您需要更多详细信息,请告诉我。我有一个名为 System 的抽象类。为了保存我的 System 对象,我有一个 SystemManager,其中包含 System 列表以及一些用于操作它的函数。里面包含:

List<System> systems = new ArrayList<System>();

现在,我想创建另一个抽象类,它是一种名为 RenderSystem 的特定类型的 System。这将从 System 继承,但还有更多功能。我还想创建一个 RenderSystemManager ,它应该完成 SystemManager 所做的一切,除了一些额外的功能。另外,我希望管理器中没有一个 System 列表,而是一个 RenderSystem 列表,以确保程序员不会放置任何常规 >系统其中的对象。我最初的直觉是继承 SystemManger,并将列表的类型更改为 RenderSystem:

systems = new ArrayList<RenderSystem>();

Java 不允许这样做,因为系统的类型是 System 而不是 RenderSystem。我认为考虑到 RenderSystem 继承自 System 就可以了。我能想到的解决此问题的一种方法是将 SystemManager 中的所有代码复制并粘贴到 RenderSystemManager 中,然后将代码行更改为:

List<RenderSystem> systems = new ArrayList<RenderSystem>();

我的另一个本能是重写 addSystem(System system) 函数,以确保它只处理 RenderSystem,但程序员可能认为他们可以这样做即使它不起作用。

@Override
public void addSystem(System system)
{
if (system instanceof RenderSystem)
{
super.addSystem(system);
}
}

不过这些看起来不太优雅。有人有什么建议吗?

最佳答案

您的经理具有与其包装的列表相同的类型安全要求。因此,它们应该遵循相同的策略,并且是通用类型:

public class BaseSystemManager<T extends System> {
private List<T> systems = new ArrayList<>();

public void addSystem(T system) {
systems.add(system);
}

// common methods
}

public class SystemManager extends BaseSystemManager<System> {
// methods specific to System handling
}

public RenderSystemManager extends BaseSystemManager<RenderSystem> {
// methods specific to RenderSystem handling
}

关于java - 具体的Java继承查询 - 需要建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22128565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com