php - 在抽象类方法中返回抽象类的子类

标签 php class inheritance polymorphism

我有一个类,它具有从数据库中检索子元素的功能。以下代码将是伪造的,因为我希望它尽可能简单。

abstract class SomeHostObject extends SomeObject {

   function getChild($identifier) {
      global $database;
      $id = $database->select('Some MySQL Query');
      // that is the problem
      return ?new? ???($id);
   }

}

如您所见,SomeHostObject 类是抽象类,必须对其进行扩展。

问题是 getChild() 不应该返回一个 SomeHostObject 实例(不仅因为它甚至不能被实例化)而是一个类的新实例扩展 SomeHostObject

例如,如果有一个扩展 SomeHostObjectPageObject 类,函数 getChild() 应该返回一个新的 PageObject 具有新 ID 的实例。

我不知道该不该称这个问题为“高级”问题,但对我来说这是一个主要问题。

最佳答案

abstract class SomeHostObject extends SomeObject {

   function getChild($identifier) {
      global $database;
      $id = $database->select('Some MySQL Query');
      // that is the problem
      return $this->createObject($id);
   }
   abstract protected function createObject($id);

}

class PageObject extends SomeHostObject
{
  protected function createObject($id)
  {
    return new PageObject($id);
  }

}

关于php - 在抽象类方法中返回抽象类的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1688334/

相关文章:

c# - 使用预定义类创建列表类,无法在其外部创建 list<t> 类

c++ - 为什么我的函数不产生输出

c++ - 菱形继承(钻石问题) - 从抽象类和具体类继承而不是实现基于共享的类

c# - 派生类中属性的可见性 (C#)

php - Laravel 验证错误

php - 根据条件从数组嵌套返回元素

php - mock php测试中的碳对象

Java-向类添加参数

ios - 作为类型扩展的 Swift 2.0 协议(protocol)

php - 通过 HTML 链接调用 PHP 函数(无形式)