【问题标题】:Why are private methods not working with polymorphism?为什么私有方法不适用于多态性?
【发布时间】:2014-01-21 09:13:26
【问题描述】:

在使用私有方法的继承/多态性时遇到了问题。

例子:

class cmsPage{

   private function getBlock(){
       $block = new cmsBlock();
       return $block
   }

   function createBlock(){
       $block = $this->getBlock();
       $block->save();
   }
   //... do various things
}


class specialCmsPage extends cmsPage{

   private function getBlock(){
       $block = new specialCmsBlock();
       return $block
   }

}

我自然希望 specialCmsPage 继承 cmsPage 的所有方法。函数getBlock() 应确保添加到 specialCmsPage 的所有内容块的类型均为 specialCmsBlock 而不是 cmsBlock。

我发现,如果我从类方法中删除“私有”,它只会按照我期望的方式工作,但我更喜欢使用这些方法,因为不应该从类外部调用这些方法。 在 getBlock() 方法前面使用“private”时,specialCmsPage 总是会收到一个 cmsBlock 对象。

有没有办法使用“private”实现我想要的?

【问题讨论】:

  • getBlock 看起来像一个坏函数。为什么会存在?
  • 你能告诉我们你用来初始化你的 specialCmsPage 并运行 getBlock 函数的代码吗?
  • getBlock 存在的原因是我可以使用“cmsPage”中的原始代码,但在“specialCmsPage”中使用时插入不同的对象。我不能在方法中使用“new”运算符,因此我创建了一个提供新子对象的可覆盖方法。

标签: php object inheritance polymorphism private


【解决方案1】:

也许您正在寻找protectedprivate 成员仅对声明它们的类可见。 protected 成员对类及其后代可见。

【讨论】:

  • Protected 似乎是我想要的,感谢您的快速回复
  • 实际上,从我看到的默认修饰符(即 no 修饰符)是您正在寻找的。 Protected 允许您在其子类中使用字段(甚至在包之外)。默认修饰符更严格,它禁止使用包外部的成员。这就是为什么当您删除私有修饰符时一切正常。希望对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
  • 2013-05-08
  • 2013-11-12
  • 2018-11-06
  • 2011-02-09
  • 2020-09-25
相关资源
最近更新 更多