我有以下层次的4个类:
MyTop
|
-------------------
| | |
BlockA BlockB BlockC
BlockA
,BlockB
和BlockC
是MyTop
的组合对象。 BlockA
提供了一个LookUpTable()
函数,BlockB
和BlockC
现在需要访问BlockA
所拥有的查找表。 BlockB
和BlockC
访问查找表有什么好(或至少是典型的)做法?
我考虑过将查找表作为一个类本身实现,但是循环表的内容与BlockA
的初始化略有耦合,将表与表解耦可能并不简单。 BlockA
(它仍然可行,但不是首选)。现在我的解决方案是将请求从BlockB
和BlockC
传递给MyTop
,让MyTop
来管理块之间的通信。但是,当有更多块需要访问BlockA
中的查找表时,这似乎不是一个好方法来处理问题。我想知道这是一个众所周知的问题,并且已经有了“最佳实践”解决方案。谢谢!
答案 0 :(得分:1)
我考虑过实施 查找表本身就是一个类,但是 循环表的内容是 稍微加上了 BlockA的初始化,它可能 解开桌子并不容易 来自BlockA(它仍然可行,但是 不喜欢)。
难道你不能简单地让BlocA初始化那个查找表所有者对象吗?将BlocA作为朋友类,它将是一个单例(如果它在你的情况下是正确的),以确保它是唯一一个访问初始化(构造?)函数。
答案 1 :(得分:1)
我不知道是否有一般解决方案,但肯定有一般建议:tell, don't ask。
从我所看到的,您正在尝试访问存储在查找表中的BlockA
数据,然后对它们执行某些操作。这违反了封装原则,只有持有数据的对象才能访问和修改它。
更好的方法是将查找表功能提取到类中,并为所有三个块添加常用方法。然后创建查找表类的三个子类,并添加仅由特定块使用的方法(如果有任何此类方法)。在BlockA
中,BlockB
和BlockC
使用这些类。与访问直接存储在BlockA
中的查找表相比,这允许更松散的耦合。
答案 2 :(得分:0)
使用当前机制,BlockB和BlockC使用BlockA中提供的功能。我的理解是它与BlockA不同。他们不相提并论。
BlockA,BlockB,BlockC继承了MyTop的方法。