Rectangle наследует Component Если в Component есть protected $color; То в экземпляре класса Rectangle будет доступна $this->color так как он наследует Component в котором тоже есть $this->color
Объявите в Component поля $width и $height, тоже protected, и перенесите в конструктор Component их инициализацию. Я просто невнимательно эту часть задания прочёл. Конструктор Rectangle тогда вообще убрать можно - достаточно будет унаследованного от Component. и вообще, хотя PHP и позволяет не объявлять заранее свойства (т.е. ваш код работоспособен), лучше это делать, поскольку так программа будет более читаемой. А так да, это уже вполне сойдёт за правду
спасибо вам за советы. извините за невнимательность с protected. в итоге вот что получил Код (Text): <?php class Color { public $red; public $green; public $blue; public function __construct($red,$green,$blue){ $this->red = $red; $this->green = $green; $this->blue = $blue; $this->color = $this->red .",". $this->green .",". $this->blue; } public function __toString() { return $this->color; } } abstract class Component { protected $color; protected $width; protected $height; abstract public function render(); } class Rectangle extends Component { public function __construct($color, $width, $height){ $this->color = $color; $this->width = $width; $this->height = $height; } public function render(){ echo "<pre><div style=\"background-color:rgb($this->color);width:$this->width;height:$this->height\"></pre></div>"; } } $color = new Color(127,0,0); $rect = new Rectangle($color, 100, 50); $rect->render();
runcore, добавил, спасибо. Хотел бы еще уточнить пару моментов - во второй части задание есть такой пункт: если я к примеру реализую это так, будет ли это нормальной практикой, либо это можно выполнить более правильно: Код (Text): class Rectangle extends Component { public function __construct($color, $width, $height){ $this->color = $color; $this->width = $width; $this->height = $height; } public function render(){ echo "<pre><div style=\"background-color:rgb($this->color);width:$this->width;height:$this->height\"></pre></div>"; } } class BorderedRectangle extends Rectangle { protected $bcolor; public function __construct($color, $width, $height, $bcolor){ $this->color = $color; $this->width = $width; $this->height = $height; $this->bcolor = $bcolor; } public function bRectangle(){ echo "<pre><div style=\"background-color:rgb($this->color);width:$this->width;height:$this->height;border: 5px solid $this->bcolor;\"></pre></div>"; } } Второй момент, также по заданию: Не совсем понял задание, что нужно почитать для выполнения?
-цвет фона лучше задавайте через вызов отдельного метода. типа public function setBgColor(Color $color) { тоесть получается что конструктор будет унаследованный от класса Rectangle. а в классе наследнике нужно будет только добавить ИМЕННО то чем он отличается от предка. свойство и метод для его установки, и render. НО тут есть еще тонкость. полностью дублировать метод рендер нет необходимости. подумайте как это сделать. если не придумаете - подскажем Добавлено спустя 1 минуту 59 секунд: что непонятного? вы передаете ему в конструкторе массив разных прямоугольников с разными свойствами. а он по очереди их отрисовывает.
Всем доброго дня. Оказалось не все так понятно. Component - абстрактный класс, т.е. мы не можем создать его экземпляр. Значит нам надо передавать в конструктор нового класса массив экземпляров класса Rectangle, в котором содержится реализация класса Component? Примерно так? Код (Text): class Renderer { public $arr; public function __construct($arr){ $this->arr = $arr; } public function showRecs(){ } } $color = new Color(127,0,0); $rect = new Rectangle($color, 100, 50); $brect = new BorderedRectangle($color, 100, 50, 'yellow'); $rect->render(); $brect->bRectangle(); $color1 = new Color(0,0,0); $rect1 = new Rectangle($color1, 100, 50); $color2 = new Color(100,0,0); $rect2 = new Rectangle($color2, 100, 50); $arr = array($rect, $rect1, $rect2); $rend = new Renderer($arr); $rend->showRecs(); И как обрабатывать сами объекты?
Да, Component абстрактный. но все его потомки (Rectangle например) уже реальные. внутри Renderer нужно проверить что в массиве лежат объекты которые являются наследниками от Component. это будет гарантировать что у них есть метод render() и значит вызывая его можно активировать отрисовку каждого объекта. читать про instanceof.
runcore, еще раз спасибо вам за помощь, вот что получилось у меня Код (Text): class Renderer { public $arr; public function __construct($arr){ $this->arr = $arr; } public function showRecs(){ foreach ($this->arr as $key => $value) { $isRectangle = ($value instanceof Rectangle); if ($isRectangle == 1) { $value->render(); } } } } $color = new Color(127,0,0); $rect = new Rectangle($color, 100, 50); $brect = new BorderedRectangle($color, 100, 50, 'yellow'); $rect->render(); $brect->bRectangle(); $color1 = new Color(0,127,0); $rect1 = new Rectangle($color1, 100, 50); $color2 = new Color(0,0,127); $rect2 = new Rectangle($color2, 100, 50); $arr = array($rect, $rect1, $rect2); $rend = new Renderer($arr); $rend->showRecs(); похоже на правду?
похоже. только вам же нужно проверять что объект от класса Component? Так же вроде в задании. тогда так $isComponent = ($value instanceof Component);
еще уточнение по поводу то есть я делаю Код (Text): class Rectangle extends Component { public function __construct($color, $width, $height){ $this->color = $color; $this->width = $width; $this->height = $height; } public function render(){ echo "<pre><div style=\"background-color:rgb($this->color);width:$this->width;height:$this->height\"></pre></div>"; } } class BorderedRectangle extends Rectangle { protected $bcolor; public function __construct($bcolor){ parent::__construct(); $this->bcolor = $bcolor; } public function bRectangle(){ echo "<pre><div style=\"background-color:rgb($this->color);width:$this->width;height:$this->height;border: 5px solid $this->bcolor;\"></pre></div>"; } } или я что-то недопонял?
конструктор в BorderedRectangle вообще можете не писать. но будет унаследован от Rectangle. цвет бордера можно задавать отдельным методом. я же писал об этом уже.
так, вроде получилось Код (Text): class BorderedRectangle extends Rectangle { protected $bcolor; public function setBgColor($bcolor) { $this->bcolor = $bcolor; } public function render(){ echo "<pre><div style=\"background-color:rgb($this->color);width:$this->width;height:$this->height;border: 5px solid rgb($this->bcolor);\"></pre></div>"; } } echo "Bordered Rectangle: "; $brect = new BorderedRectangle($color, 100, 50); $bcolor = new Color(127,127,127); $brect->setBgColor($bcolor); $brect->render();