Всем привет, вот такое задание, возможно с ним кто-то из вас уже сталкивался. буду благодарен любой помощи Создать вспомогательный класс Color, содержащий 3 поля типа int: $red, $green, $blue; Создать абстрактый класс Component, содержащий абстрактный метод render(), поле color типа Color, поля width и heigth типа int. Создать потомка этого класса - класс Rectangle, реализующий метод render(), рисующий на странице прямоугольник заданной ширины и высоты, залитый заданным цветом. Например, код: $color = new Color(127,0,0) $rect = new Rectangle($color, 100, 50); $rect->render(); должен вывести на страницу следующий код: <div style="background-color:RGB(127,0,0);width:100px;height:50px"></div> Создать от класса Rectangle два класса потомка: BorderedRectangle - позволяющий задавать цвет бордера; PositionedRectangle - позволяющий задавать абсолютные координаты div'a на странице. Создать класс Renderer, которому в конструктор передается массив объектов типа Component. Объект типа Renderer должен выводить на страницу заданный массив компонентов, содержащий всех выше перечисленных потомков.
я не совсем понимаю что значит "поле color типа Color" и как его объявить Код (Text): class Color { public function Color($red,$green,$blue) { echo "$red,$green,$blue"; } } abstract class Component { abstract protected function render($width, $height); } class Rectangle extends Component { public function Rectangle($width, $height){ $width = $this->width; $height = $this->height; } public function render($width, $height){ echo "<pre><div style=\"background-color:RGB(127,0,0);width:$width;height:$height\"></pre> </div>"; } }
Спроси у тех кто давал тебе задание, "поле color типа Color" могу предположить что это переменная $color с экземпляром класса Color: $color= new Color;
да, вы оказались правы, спасибо. а как быть с этим моментом Код (Text): $rect = new Rectangle($color, 100, 50); $rect->render(); нужно создать конструктор и метод в дочернем классе абстрактного?
Гляди, у тебя в "рендере" цвет жестко прописан. Сдается мне, он должен браться из того самого поля типа color, которое содержится в родителе и, автоматом, доступно в наследнике.
Ребят, подскажите в чем неправ, пожалуйста: Код (Text): <?php class Color { public function __construct($red,$green,$blue) { $colors = "$red,$green,$blue"; return $colors; } } abstract class Component { abstract protected function render($color, $width, $height); } class Rectangle extends Component { function __construct($color,$width,$height) { $prop = "background-color:$color;width:$width;height:$height" return $prop; } public function render($width, $height){ echo "<pre><div style=\"$prop\"></pre> </div>"; } } $color = new Color(127,0,0); $rect = new Rectangle($color, 100, 50); $rect->render();
конструктор возвращает экземпляр класса. ты не можешь в конструкторе сделать какой-то ретурн ибо ему некуда будет записываться.
Не понятно, сделай дополнительный метод в классе Color и когда $prop формируешь вызови например так $color->get()
а зачем вообще возврат из функции? в классе цвета создай три свойства, стек конструктора (аргументы) просто пропиши скопируй в них. а дальше создавая треугольник и передавая цвет - обращайся к свойствам экземпляра класса цвета class color { public $red, $gree, $blue; function __con($red, $green, $blue){ $this->red = $red; /* etc */ } } class rect { function _con($col, $a,$b){ $red = $col->red; /* etc */ } } $c = new color(1,2,3); $r = new rect($c, 4,5); можешь еще и сохранить этот цвет как свойство класса треугольника тогда в конструкторе запиши его а потом из любого метода читай
немного запутался, вот код, как советовал Ganzal class Color { public $red, $green, $blue; function __construct($red, $green, $blue){ $this->red = $red; $this->green = $green; $this->blue = $blue; } } abstract class Component { abstract protected function render($color, $width, $height); } class Rectangle { function __construct($color, $width, $height){ $red = $color->red; $green = $color->green; $blue = $color->blue; } public function render(){ echo "<pre><div style=\"background-color:rgb($color);width:$width;height:$height\"></pre></div>"; } } , как и что нужно передать в public function render чтобы получить корректный вывод при $color = new Color(127,0,0); $rect = new Rectangle($color, 100, 50); $rect->render(); Добавлено спустя 27 минут 32 секунды: не пойму как вывести вот это $rect->render(); без передачи аргументов
ronnyhab, ну по коду же видно, что что такое инкапсуляция вы вообще без понятия... Теорию какую-нибудь почитайте, что-ли... В php свойства неспроста так называются - они хранят свойства (характеристики) объектов данного класса, такие, как цвет, к примеру. У вас же в задании ясно сказано - все компоненты имеют свойство "цвет", у вас оно не объявлено, не инициализируется... Аналогично, у прямоугольника есть свойства ширина и высота. Потом, у меня такое впечатление, что функции вы тоже не сильно понимаете, а значит ООП вам пока очень и очень рано. Вот тут, к примеру, вы присвоили локальным переменным $red, $green и $blue какие-то значения. Зачем? Локальные переменные уничтожаются при выходе из своей области видимости (то бишь после завершения работы конструктора). Ganzal вам не дал буквально решения, он просто показал в каком направлении идти. Хотите, вот вам совсем прозрачная подсказка: Код (PHP): abstract class Component { protected $color; public function __construct($color) { $this->color = $color; } abstract public function render(); } Если и сейчас всё так же не понятно, то за учебники Добавлено спустя 2 минуты 32 секунды: https://php.net/manual/ru/language.oop5.basic.php - читайте до полного понимания. Ну хотя бы это
еще можно добавить abstract protected function render(Color $color, $width, $height); ... function __construct(Color $color, $width, $height) {
Всем спасибо за советы, почитал что вы говорили, и вот что получилось, Код (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; public function __construct($color) { $this->color = $color; } 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() Скажите, пожалуйста, насколько написанное мной соответствует первой части задания. Заранее спасибо