我试图提供非拥有结构的“视图”来分离系统的组件。
假设一组具有不同方法的特征:Drawable
,Modifiable
以及许多实现至少一个特征的结构 - SimpleBox
,Panel
,Expression
。
系统的不同组件将需要使用特定特征的方法频繁访问这些对象的序列;考虑 aDrawingManager
或 a ModifyManager
:
struct DrawingManager {
items: Vec<Weak<Drawable>>,
}
struct ModifyManager {
items: Vec<Weak<Modifiable>>
}
虽然可以在两个管理器中引用单个对象,但假设所有结构都有一个单独的所有者:
struct ObjectManager {
boxes: Vec<Rc<Box>>,
panels: Vec<Rc<Panel>>,
expressions: Vec<Rc<Expression>>,
}
理想情况下,能够管理从一个位置删除结构将是有用的——即只需将其从ObjectManager
足以使所有其他组件中的引用无效的情况中删除(因此使用Weak
)。
- 有没有办法做到这一点?
- 这是实现这一目标的正确方法吗?
- 有没有更惯用的方式来实现这个功能?
该系统包含多个特征,因此使用所有其他特征的方法制作单个特征似乎是个坏主意。几个特征有不止一种方法,所以用闭包替换它们是不可能的。
我试过的
由于一个对象可能产生一个或多个Rc<Trait>
,我们可以设想通过HashMap<ID, Vec<Rc<Any>>>
使每个结构都有一个唯一的 来实现这一点ID
,它映射到Rc
为它制作的所有内容的列表。
当我们想要删除一个对象时,我们将它从相应的列表中删除,并删除 hashmap 中的条目,使所有Weak
引用无效。
但是,实现这一点失败了,因为要插入HashMap
,必须向上转换Rc<Trait>
-> Rc<Any>
,然后才能向下转换它。