在抽象超类的静态方法中创建子类的实例? [复制]

Posted

技术标签:

【中文标题】在抽象超类的静态方法中创建子类的实例? [复制]【英文标题】:Create instance of subclass within static method in abstract superclass? [duplicate] 【发布时间】:2019-04-15 12:06:14 【问题描述】:

如何在 php 中的抽象超类中的静态方法中创建子类的实例?

我的代码是这样的:

abstract class GenericUserMessage 
    private $_message;
    private $_type;

     protected abstract function getAllMessages();

     function __construct( $key, $message, string $type = NoticeTypes::INFO, $strict = false )  // ... 

    /**
     * @param $key
     * @param $message
     * @param string $type
     */
    public static function createOrUpdate($key,$message,string $type = NoticeTypes::INFO) 
        if(self::exists($key)) 
            self::updateMessage($key,$message,$type);
         else 
            new self($key,$message,$type); // here is the error
        
    


class UserMessage extends GenericUserMessage 
    protected function getAllMessages() 
       // ...
       return $all_messages;
    

这会失败并出现以下致命错误:

无法实例化抽象类“GenericUserMessage”

有道理!但是我想要创建一个实现子类的实例。这可能吗?在某些情况下是否有意义?

【问题讨论】:

【参考方案1】:

没关系,我找到了方法:

abstract class GenericUserMessage 

    protected abstract function instantiate($key,$message,string $type = NoticeTypes::INFO);

    public static function createOrUpdate($key,$message,string $type = NoticeTypes::INFO) 
        if(self::exists($key)) 
            self::updateMessage($key,$message,$type);
         else 
            self::instantiate($key,$message,$type);
        
    


【讨论】:

很高兴看到你想出了一个办法。另一种方法是使用new static() 而不是new self() 谢谢,这样更好!

以上是关于在抽象超类的静态方法中创建子类的实例? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

抽象abstract

如何在 Java 静态块中创建本地类? [复制]

API 平台:规范化映射超类仅包括来自超类的属性,不包括子类

第6章:继承和抽象类

子类会在后台包含来自超类的私有方法和成员变量吗? [复制]

我们可以声明一个抽象方法来返回抽象超类中的子类对象而不需要新的实例化吗?