虽然我在 ObjC 中编码,但这个问题是有意与语言无关的 - 它应该适用于大多数 OO 语言
假设我有一个“Collection”类,我想创建一个继承自“Collection”的“FilteredCollection”。过滤器将在对象创建时设置,从它们开始,该类将表现得像一个“集合”,过滤器应用于其内容。
我以明显的方式和子类 Collection 做事。我覆盖了所有的访问器,并认为我已经完成了一项非常出色的工作——我的 FilteredCollection 看起来应该像一个 Collection 一样,但是其中的对象与我的过滤器相对应的对象被过滤给用户。我想我可以愉快地创建 FilteredCollections 并将它们作为 Collections 在我的程序中传递。
但我来测试 - 哦不 - 它不起作用。深入调试器,我发现这是因为某些方法的 Collection 实现正在调用重写的 FilteredCollection 方法(例如,Collection 在迭代其对象时依赖于“count”方法,但现在它正在获取过滤后的计数,因为我覆盖了 count 方法以提供正确的外部行为)。
这里有什么问题?为什么感觉某些重要原则被违反了,尽管它也感觉像 OO '应该' 以这种方式工作?这个问题的一般解决方案是什么?有吗?
顺便说一句,我知道这个问题的一个很好的“解决方案”是在我将对象放入集合之前过滤对象,而根本不必更改 Collection,但我问的是一个更一般的问题比这 - 这只是一个例子。更普遍的问题是不透明超类中的方法依赖于可能被子类更改的其他方法的行为,以及在您想要子类化对象以更改此类行为的情况下该怎么做。