班级A
拥有班级c
的实例C
。另一个班级B
必须通过c
方法修改C::setBlah();
。
在C getC();
中创建一个访问者A
然后使用A.getC().setBlah()
是不是很糟糕?
或者我应该创建一个可以调用A::setBlah();
的方法C::setBlah();
吗?如果有这样的方法,这不是很烦人吗?
答案 0 :(得分:2)
和大多数人一样“X做不好吗?”问题,答案是它完全取决于给定的情况。
有时候,拥有getC()
类函数可能是一个非常糟糕的主意,因为它打破了封装。其他时候它可能完全正常,因为封装该细节可能是无关紧要的,编写大量的包装函数会增加您必须编写的代码量。
选择对于给定情况最有意义的选择。在我写的代码中,我采用了两种方法。
如果你选择getC()
路线,请务必返回参考号;否则你将修改一个听起来不像你想要的副本。或者,您可以考虑将A::c
公开,以便您根本不需要任何功能。
要考虑的第三个选项是C
的继承,这样就无需getC()
中的A
或包装函数。
答案 1 :(得分:1)
如果C有许多类似的方法可以被A外的类调用,我绝对不会将它们添加到A.我更喜欢尽可能减少接口。如果这些更改是相关的并且一起完成,您可以向A添加专用的单个函数以立即执行对C的所有调用,并以直观的名称逻辑收集所有这些更改。
这样的设置也提出了一个问题:为什么B需要触摸A的成员C?也许你的设计不太正确 - C应该是B的成员而不是A?
答案 2 :(得分:1)
方法C getC();
会创建c
的副本,因此调用A.getC().setBlah()
会修改c
的副本,而不是c
A
的副本}。