我正在尝试使用抽象工厂模式。我创建了一个类,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
)。
提前感谢您提供的任何建议。