1
11
我会重新考虑这个的必要性。 如果您正在使用继承,那么您建议“bar”是一个“foo”。如果“bar”总是一个“foo”,那么在“foo”上工作的方法也应该在“bar”上工作。 如果不是这样的话,我会把它作为一个私有方法进行重写。公开地说,酒吧应该是一个FOO。 只是为了更进一步- 如果你能做到这一点,事情就会变得非常复杂。您可能遇到以下情况:
不过,实际上可以使用反射来强制这种行为。我认为这是一个坏主意,但是foospecificMethod()可以检查这个类型,如果它不是type of(foo),则抛出一个异常。这会很混乱,而且气味很难闻。 根据问题的编辑进行编辑: 编译器无法强制执行您的请求。如果您真的想强制编译器检查这个,并防止它发生,那么您真的应该考虑将foo设置为一个密封类。在这种情况下,您可以使用子类化以外的其他扩展方法。 例如,您可能希望考虑使用事件或委托来扩展行为,而不是允许对象成为子类。 尝试做你正在完成的事情基本上就是试图阻止继承的主要目标。 |
2
6
布赖恩关于里斯科夫替代的观点是正确的。里德关于“IS-A”的观点是正确的(也是改进的);事实上,他们都在告诉你同样的事情。 你的公共方法是 合同 对于类foo的用户来说,“您可以”在foo上调用这些方法。 子类化foo意味着您要说的是,在可以使用foo的地方,子类(例如bar)总是可以接受的。特别是,它意味着您继承的不是(必然)foo的实现(您可以重写它,或者foo可能是抽象的,并且不为方法提供特定的实现)。 实现继承(如果有的话)是一个细节;你是什么 真正继承 是公共接口、合同、 承诺 对于用户来说,一个酒吧可以像比赛场地一样使用。 事实上,他们可能永远不会知道他们有一个条,而不是一个foo:如果我创建一个foofactory,并编写它的foo*getafoo()来返回指向条的指针,他们可能永远不会知道, 而且不必 . 当你打破这个契约,你就打破了对象方向。(Java集合类,通过抛出不支持的异常,完全打破OO -用户不能再使用多态的所谓子类。这是一个很差的设计,对很多Java用户来说,这是一个很大的问题, 不 要模仿的东西。) 如果有一个foo子类不能使用的公共方法,那么这个方法不应该在foo中,它应该在foo子类中,其他子类应该从foo派生。 现在,这并不意味着foo中的所有方法都可以在子类上调用。不,我没有自相矛盾。 非公开的 方法不是类的公共接口的一部分。 如果您想要一个在foo中不能在bar上调用的方法, 和 不应该在foo中公开调用,然后使该方法私有或受保护。 |
3
4
不,这会违反 Liskov substitution principle . 实际上,您可以让它在bar中“throw notImplementedException()”,或者从foo中移除该方法并将其向下移动到它应用的子类中。 |
4
2
将函数设为私有将阻止子类直接调用它。 如果您谈论的是不希望重载的虚拟函数,那么在您希望“锁定”函数的工作点将该函数标记为密封的。 即使它是一个私有函数,它仍然可以通过反射来调用。 您还可以在接口上声明函数,并在类上显式实现接口,这将强制您将函数强制转换为接口以使用该函数。 |
5
1
您可以创建一个私有函数,然后使用反射调用它。可能有点落水了。无论如何,只需将函数放在基类中,并添加一些注释,说明只应从基类调用函数。也许是那些用intellisense显示的漂亮的///评论。然后,你可能会得到一个bug,但然后,你总是会得到bug,你能做的最好的事情就是记录下这种情况,试图避免它。 |
6
0
我最终使用的解决方案是创建一个公共的内部继承类。这样,它就能够访问基类的私有变量(如它需要的那样),而且我不需要公开那些私有变量或函数(我不想公开)。 非常感谢你的建议,这使我重新思考我需要从这个安排。 |
7
0
派生类在不违反Liskov替换原则的情况下隐藏基类成员有两个原因:
我假设,当基类成员隐藏
经常
设计不好的标志,在某些情况下隐藏基类成员比暴露它们更合适;如果派生类不能
可能地
正确使用受保护的方法(如
|
8
0
你应该考虑作文[ http://en.wikipedia.org/wiki/Composite_pattern }如果您想要实现您正在尝试做的事情,并从私有对象(即您当前继承的对象)中公开方法,则为过度继承。 |
9
0
正如其他人指出的,这是不可能的,最重要的是,这不应该是必要的。
当我有以下结构时,我遇到了同样的问题:
现在我可以打电话了
为了解决这个问题,我只需要将父类的代码拆分为两个类:
|