我正在用Java开发一个用户界面框架。这不是一个非常严肃的问题,但我仍然在努力做到这一点。
我对容器有一个小设计问题。在我的设计中,我有Control
,它是所有UI元素的基类。它有大小,位置和渲染方法等字段。
然后有Container
可以容纳一组控件。例如,列表框包含多个控件。 Container
是Control
的子类。它只是添加了访问子控件的方法,例如: Container.renderChildren()
。
这一切都很好,但这意味着Container
需要保留2个列表。普通旧Control
的一个列表和它所拥有的Container
的一个列表。您无法将它们放入单个List<Control> childList;
中,因为容器具有其他功能。他们需要与普通控制措施区别对待。
所以我决定引入Component
,它持有一个控件或一个容器,并带有一个标志,说明它包含哪一个。然后每个Container只有一个组件列表,而Component负责抽象出Control和Container之间的差异。例如,有一个Component.renderChildren()调用适当的方法。
问题是它看起来不是很优雅。对于继承问题来说,感觉就像是一种解决方法。起初我只是使每个Control都具有类似容器的功能,因此所有控件都能够保存子控件。但我也不喜欢这样,因为一个控件不应该知道关于孩子的任何事情,它应该只是一个简单的UI元素。
我刷新了我对C#如何做到的知识。在C#组件中实际上是控件的子类,而不是相反。但我也不喜欢这样。
我为言辞不好且冗长的问题道歉。我并没有付出太多努力,因为这是一个相当小的问题,但如果你自己可能会感到困扰,那么有兴趣听取意见。
public class Control {
public Dimensions dimensions;
public void render() {
// ...
}
}
public class Container extends Control {
protected ControlList childControls;
protected ContainerList childContainers;
public ControlList getRenderList() {
// return all children (both controls and containers)
// ...
}
}
public class Renderer {
// container for main window that holds the 'tree' of all other controls
protected Container rootContainer;
public void render() {
ControlList renderList = rootContainer.getRenderList();
// do the render
// ...
}
}