제 애플리케이션에서 다르게 렌더링되는 요소가 여러 개 있습니다. 확장 된 추상 클래스를 만들었습니다.다른 수의 매개 변수를 사용하는 하위 클래스 생성자
abstract class Element {
protected $_value = null;
public function __construct($value) {
$this->_value = $value;
}
// ...
public abstract function render();
}
요소의 예는 단락 태그로 묶은 텍스트 일 수 있습니다.
class TextElement extends Element {
public function render() {
return "<p>{$this->_value}</p>\n";
}
}
둘 이상의 값이있는 요소를 만드는 데 문제가 있습니다. 예를 들어 이미지 요소는 이미지 태그를 렌더링하고 여러 특성을 포함 할 수 있습니다. 추상 클래스의 생성자는 하나의 매개 변수 만 허용하기 때문에 이것은 문제입니다. 이 문제에 대한 두 가지 가능한 해결책이 있습니다. Element 생성자 (솔루션 1)에 다른 속성을 포함하는 배열을 전달할 수도 있고, 하위 클래스 (솔루션 2)의 생성자를 재정의 할 수도 있습니다. 제 질문은 이러한 솔루션 중 어느 것이 더 나은 디자인인지 또는 더 나은 솔루션이 존재하는지 여부입니다. 대신 인터페이스를 사용해야합니까? 사람이 어디에 코드를 볼 경우
해결 방법 1
class ImageElement extends Element {
public function render() {
return "<img src=\"{$this->_value['src']}\" alt=\"{$this->_value['alt']}\" />";
}
}
$imageElement = new ImageElement(array('src' => '/image.png', 'alt' => 'image'));
최초의 솔루션으로 해결 방법 2
class ImageElement extends Element {
protected $_alt;
public function __construct($src, $alt) {
$this->_value = $src;
$this->_alt = $alt;
}
// ...
public function render() {
return "<img src=\"{$this->_value}\" alt=\"{$this->_alt}\" />";
}
}
인터페이스를 사용하는 경우 요소 컬렉션을 반복 할 수 없게됩니다. 인터페이스와 추상 클래스를 사용하는 것이 좋을까요? 내가 보는 유일한 문제는 추상 클래스가 본질적으로 비어 있다는 것입니다. – birderic