从一些简短的提示中,当我执行以下操作时,我发现在重写子类中的超类方法时出现错误:
但是,如果我在另一个方向上执行此操作,则不会抛出任何错误:
这对我来说似乎有点直观 - 我希望它能以相反的方式工作,以强制执行信息隐藏和封装。这似乎允许糟糕的设计,允许内部以可能破坏其他方法的方式暴露,我不能看到这是一个好主意的情况。为什么以这种方式实施,我错过了什么?
此外,这是其他编程语言的标准做法吗?
答案 0 :(得分:15)
你所谓的“强制信息隐藏”是可能会破坏子类的东西,因为突然的属性和方法可能会消失。你不能通过这种方式放松限制来破坏事物。
private
有点不同:在这种情况下,从子类的角度来看,属性/方法不存在。因此没有理由,为什么子类可能不会引入具有该名称的属性,因为它将是不同的属性。
你是对的,这可能导致设计不佳,但你总是可以构建一个设计不佳的应用程序。
答案 1 :(得分:9)
您不能降低班级成员的知名度,只能增加他们。
想象一下A类有一个公共方法,而一个子类B会把它变成私有。 B可以被视为类型A,假设它具有该公共方法。
答案 2 :(得分:0)
如果一个超类公开公开一个方法,那么它的所有子类也必须公开相同的方法(或一个被覆盖的版本),因此减少方法的可访问性是一个子类在PHP中是非法的(几乎每个类都是基于类的) OO语言)。
相反的情况并非如此,因此增加子类中方法的可访问性是完全正确的。
答案 3 :(得分:0)
如果您认为在子类中公开private / protected方法表示存在问题,只需将方法设为final。
以这种方式看待:通过 NOT 使方法成为最终,您允许任何子类随意覆盖它;这显然包括提高其知名度。