我遇到的问题很具体,有点难以解释。让我知道您是否需要任何详细信息。我有一个称为System的抽象类。为了容纳我的System对象,我有一个SystemManager,其中包含一个System列表以及一些用于操纵它的函数。其中包含:

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


现在,我要创建另一个抽象类,它是称为SystemRenderSystem的特定类型。这将从System继承,但具有更多功能。我还想创建一个RenderSystemManager,它应该执行SystemManager的所有工作,除了一些额外的功能。另外,我希望管理器中没有System列表,而是希望有RenderSystem列表,以确保程序员不要在其中放置任何常规的System对象。我最初的直觉是继承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/

10-11 20:52