我注意到在PHP中,以下代码无需投诉:
class A {
public static function echoes($b) {
echo $b->protectedFunction();
}
}
class B extends A {
protected function protectedFunction() {
return "this is protected";
}
}
$b = new B();
A::echoes($b);
但是我已经在C#中尝试了这个并且它不起作用,因为父母无法访问受子保护的成员。
我的问题是谁在这里得到了OOP原则?我已经通读了LSP,但它似乎并不关心父类,所以父母访问受子保护的成员(如PHP假定它)或者是否应该受到限制(如C#假设)是正确的它应该是)?
答案 0 :(得分:2)
C#限制访问的方式似乎是最合理的方式。
父母不应该从孩子那里继承任何东西。如果没有从孩子那里继承任何东西,父母就不应该访问孩子的受保护方法。
答案 1 :(得分:1)
我认为你可能会遇到问题,让父母知道关于孩子的事情。因为父类用于从多个类中提取和捆绑行为和属性,所以信息的方式只是一个方向。
也许在某些情况下您需要访问受保护的属性,但我想无论何时不需要它都可以避免它。
答案 2 :(得分:0)
PHP是一种动态类型语言。在实际执行该行代码之前,不会检查函数和方法调用。在PHP中,您可以使用不同的方法从同一个类中获得两个对象实例。 This works fine.
像C#这样的静态类型语言需要在执行之前知道对象的类型。您仍然可以use reflection to call children methods from the parent,但无法动态添加新方法。