我有一个接口和两个实现它的类。对于接口中的一种方法,两种实现需要不同的参数。一种方法是根本不使用类型或使用联合类型。两者都感觉不对。
class OptionsA {
public string $someSpecificOptionForA;
public int $anotherSpecificOptionForA;
...
}
class OptionsB {
public bool $someSpecificOptionForB;
...
}
interface InteractsWithQueue {
public function getNextEntry(OptionsA|OptionsB $options) : QueueEntry;
}
class ProcessorA implements InteractsWithQueue {
public function getNextEntry(OptionsA|OptionsB $options) : QueueEntry {...}
}
class ProcessorB implements InteractsWithQueue {
public function getNextEntry(OptionsA|OptionsB $options) : QueueEntry {...}
}
接口是关于行为的,而不是关于对象的状态的。基于此,可能这样的解决方案会合适:
<?php
class QueueEntry {
public string $text;
}
class OptionsA {
public string $someSpecificOptionForA;
public int $anotherSpecificOptionForA;
}
class OptionsB {
public bool $someSpecificOptionForB;
}
interface InteractsWithQueue {
public function getNextEntry() : QueueEntry;
}
class ProcessorA implements InteractsWithQueue {
private OptionsA $options;
public function setOptions(OptionsA $options) {
$this->options = $options;
}
public function getNextEntry() : QueueEntry {
$qe = new QueueEntry;
$qe->text = "ProcessorA Entry";
return $qe;
}
}
class ProcessorB implements InteractsWithQueue {
private OptionsB $options;
public function setOptions(OptionsB $options) {
$this->options = $options;
}
public function getNextEntry() : QueueEntry {
$qe = new QueueEntry;
$qe->text = "ProcessorB Entry";
return $qe;
}
}
class EntityA {
public function getProcessor(OptionsA $options) : InteractsWithQueue {
$processor = new ProcessorA;
$processor->setOptions($options);
return $processor;
}
}
class EntityB {
public function getProcessor(OptionsB $options) : InteractsWithQueue {
$processor = new ProcessorB;
$processor->setOptions($options);
return $processor;
}
}
$a = new EntityA;
$optsA = new OptionsA;
$a->getProcessor($optsA);
var_dump($a->getProcessor($optsA)->getNextEntry());
$b = new EntityB;
$optsB = new OptionsB;
var_dump($b->getProcessor($optsB)->getNextEntry());