0

我正在尝试使用抽象工厂模式。我创建了一个类,FactoryProducer它基于传递给两个类方法之一的字符串创建一个特定于类的工厂。

我遇到的问题是我扩展了一个具体的工厂类,但FactoryProducer返回的接口类型不包含该方法。VS Code 说该方法不存在。这是相关代码

工厂生产者班

/**
 * Creates database or model factory.
 */
class FactoryProducer {
    /**
     * Creates a factory for the Model classes based on the given function argument.
     *
     * @param string $type The model class (e.g. 'asset', 'employee')
     * @return ModelFactoryInterface The given model's factory.
     */
    public static function getModelFactory(string $type) {
        switch($type) {
            case 'asset':
                return new \Inc\Models\AssetModelFactory;
                break;
            case 'application':
                //code here
                break;
        }
    }
}

混凝土工厂班AssetModelFactory

/**
 * The factory for the Asset class.
 */
class AssetModelFactory implements ModelFactoryInterface {

    /**
     * Create an empty Asset class object.
     *
     * @return Asset
     */
    function create(): Asset {
        return new Asset();
    }
    /**
     * Creates an Asset object instantiated with the given properties.
     *
     * @param array $props The properties for the class.
     * @return void
     */
    function createWithProps(array $props): Asset {
        $asset = new Asset();
        $keysToCheck = ['name', 'companyName', 'type', 'label', 'location', 'employees', 'key'];
        if(\Inc\Base\Helpers::array_keys_exists($keysToCheck, $props)) {
            $asset->setProperties($props['name'], $props['companyName'], $props['type'], $props['label'], $props['location'], $props['employees'], $props['key']);
            return $asset;
        }
        else {
            return new \WP_Error('incorrect_props', 'You did not include all of the necessary properties.');
        }
        
    }

}

我遇到的问题是第二种方法,createWithProps(array $props)因为接口不包含此方法:

/**
 * The interface for model classes.
 */
interface ModelFactoryInterface {
    /**
     * Creates an object that extends AbstractModel
     *
     * @return AbstractModel
     */
    public function create(): AbstractModel;
}

如您所见,具体类对象扩展了一个抽象类。这是给出错误的代码:

$assetFactory = \Inc\Base\FactoryProducer::getModelFactory('asset');
$asset = $assetFactory->createWithProps($request); 

我想知道我是否错误地实现了抽象工厂类,或者这是否是 VS Code 的预期行为,因为返回的具体类FactoryProducer是基于参数动态的(例如,我已将“资产”传递FactoryProducer::getModelFactory给最终将返回 的实例AssetModelFactory,但官方返回类型是ModelFactoryInterface)。

提前感谢您提供的任何建议。

4

1 回答 1

0

我能够弄清楚我做了什么。我习惯于像 C# 这样的编程语言,其中我可以在声明变量之前对其进行强类型化。我最终重构了代码,以便工厂拥有返回特定具体对象的方法,而不是使用 switch 语句:

class DBFactory implements DBFactoryInterface  {

    public static function createAsset(): AbstractDB { 
        return new \Inc\DB\AssetDB;
    }

    public static function createApplication(): AbstractDB { 
        return new \Inc\DB\ApplicationDB;
    }

    public static function createCompany(): AbstractDB { 
        return new \Inc\DB\CompanyDB;
    }
}

于 2021-01-04T17:10:24.707 回答