我遇到的问题很具体,并且有点难以解释。让我知道你是否需要更多关于任何事情的细节。我有一个叫System
的抽象类。为了容纳我的System
对象,我有一个SystemManager
,其中包含System
的列表以及一些用于操作它的函数。它里面包含:具体的Java继承查询 - 需要建议
List<System> systems = new ArrayList<System>();
现在,我想创建另一个抽象类是所谓的RenderSystem
的System
特定类型。这将继承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);
}
}
虽然这些看起来不太优雅。任何人有任何建议?
看来你的'想法RenderSystemManager'违反了[ LSP](http://en.wikipedia.org/wiki/Liskov_substitution_principle),因为'SystemManager'允许添加'System's,但其所声称的子类型不会。 – delnan
考虑将您的'System'类的名称更改为不同的避免与'java.lang.System'类冲突 – Pshemo
同意@delnan,但是LSP维基百科页面可能有点迟钝*基本上*,它表明子类不应该从超类中删除*特性,这就是你提出的设计确实如此,我建议你考虑JB Nizet的解决方案b elow。 –