За последние 24 часа нас посетили 59362 программиста и 1772 робота. Сейчас ищут 1288 программистов ...

Помогите с заданием ООП

Тема в разделе "Прочие вопросы по PHP", создана пользователем ronnyhab, 19 дек 2014.

  1. ronnyhab

    ronnyhab Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    21
    Симпатии:
    0
    Всем привет, вот такое задание, возможно с ним кто-то из вас уже сталкивался. буду благодарен любой помощи

    Создать вспомогательный класс 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 должен выводить на страницу заданный массив компонентов, содержащий всех выше перечисленных потомков.
     
  2. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    и в чем именно проблема? создавайте классы. создавайте наследников.
     
  3. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Вот по классам php.net/manual/ru/language.oop5.php
     
  4. ronnyhab

    ronnyhab Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    21
    Симпатии:
    0
    я не совсем понимаю что значит "поле color типа Color" и как его объявить
    Код (Text):
    1.  
    2. class Color
    3.  
    4. {
    5.     public function Color($red,$green,$blue) {
    6.         echo "$red,$green,$blue";
    7.     }
    8. }
    9.  
    10. abstract class Component
    11. {
    12.     abstract protected function render($width, $height);
    13. }
    14.  
    15. class Rectangle extends Component
    16. {
    17.     public function Rectangle($width, $height){
    18.         $width = $this->width;
    19.         $height = $this->height;
    20.     }
    21.     public function render($width, $height){
    22.         echo "<pre><div style=\"background-color:RGB(127,0,0);width:$width;height:$height\"></pre>
    23.                 </div>";
    24.     }
    25. }
     
  5. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Спроси у тех кто давал тебе задание, "поле color типа Color" могу предположить что это переменная $color с экземпляром класса Color: $color= new Color;
     
  6. ronnyhab

    ronnyhab Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    21
    Симпатии:
    0
    да, вы оказались правы, спасибо.
    а как быть с этим моментом
    Код (Text):
    1. $rect = new Rectangle($color, 100, 50);
    2. $rect->render();
    нужно создать конструктор и метод в дочернем классе абстрактного?
     
  7. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Да конструктор в классе Rectangle
     
  8. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Гляди, у тебя в "рендере" цвет жестко прописан. Сдается мне, он должен браться из того самого поля типа color, которое содержится в родителе и, автоматом, доступно в наследнике.
     
  9. ronnyhab

    ronnyhab Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    21
    Симпатии:
    0
    Ребят, подскажите в чем неправ, пожалуйста:
    Код (Text):
    1. <?php
    2.  
    3. class Color {
    4.     public function __construct($red,$green,$blue) {
    5.        $colors = "$red,$green,$blue";
    6.        return $colors;
    7.     }
    8. }
    9.  
    10. abstract class Component
    11. {
    12.     abstract protected function render($color, $width, $height);
    13. }
    14.  
    15. class Rectangle extends Component
    16. {
    17.     function __construct($color,$width,$height) {
    18.        $prop = "background-color:$color;width:$width;height:$height"
    19.        return $prop;
    20.     }
    21.  
    22.     public function render($width, $height){
    23.         echo "<pre><div style=\"$prop\"></pre>
    24.                 </div>";
    25.     }
    26. }
    27.  
    28. $color = new Color(127,0,0);
    29. $rect = new Rectangle($color, 100, 50);
    30. $rect->render();
     
  10. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Ну вроде всё нормально
     
  11. ronnyhab

    ronnyhab Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    21
    Симпатии:
    0
    Вроде как да, я немного плаваю в ООП, но эта ерунда не работает. Ничего не выводит
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а давно у нас конструкторы возвращают значения?
     
  13. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Так у тебя конструкторы что-то возвращают, может тут ошибка в логике? Сделай отладку phpfaq.ru/debug
     
  14. ronnyhab

    ronnyhab Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    21
    Симпатии:
    0
    Ganzal, я не утверждаю что все правильно, просто спрашиваю совета.
    denis01, спасибо, попробую.
     
  15. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    конструктор возвращает экземпляр класса. ты не можешь в конструкторе сделать какой-то ретурн ибо ему некуда будет записываться.
     
  16. ronnyhab

    ronnyhab Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    21
    Симпатии:
    0
    Ganzal, как тогда быть?
     
  17. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    сделай дополнительный метод который будет возвращать твои значения.
     
  18. ronnyhab

    ronnyhab Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    21
    Симпатии:
    0
    denis01, хорошо, а как его тогда оформить чтобы он вызывался как конструктор?
     
  19. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Не понятно, сделай дополнительный метод в классе Color и когда $prop формируешь вызови например так $color->get()
     
  20. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а зачем вообще возврат из функции? в классе цвета создай три свойства, стек конструктора (аргументы) просто пропиши скопируй в них. а дальше создавая треугольник и передавая цвет - обращайся к свойствам экземпляра класса цвета
    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);
    можешь еще и сохранить этот цвет как свойство класса треугольника тогда в конструкторе запиши его а потом из любого метода читай
     
  21. ronnyhab

    ronnyhab Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    21
    Симпатии:
    0
    немного запутался, вот код, как советовал 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(); без передачи аргументов
     
  22. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    ronnyhab, ну по коду же видно, что что такое инкапсуляция вы вообще без понятия... Теорию какую-нибудь почитайте, что-ли... В php свойства неспроста так называются - они хранят свойства (характеристики) объектов данного класса, такие, как цвет, к примеру. У вас же в задании ясно сказано - все компоненты имеют свойство "цвет", у вас оно не объявлено, не инициализируется... Аналогично, у прямоугольника есть свойства ширина и высота. Потом, у меня такое впечатление, что функции вы тоже не сильно понимаете, а значит ООП вам пока очень и очень рано.
    Вот тут, к примеру, вы присвоили локальным переменным $red, $green и $blue какие-то значения. Зачем? Локальные переменные уничтожаются при выходе из своей области видимости (то бишь после завершения работы конструктора). Ganzal вам не дал буквально решения, он просто показал в каком направлении идти. Хотите, вот вам совсем прозрачная подсказка:
    Код (PHP):
    1. abstract class Component
    2. {
    3.     protected $color;
    4.     public function __construct($color) 
    5.     {
    6.          $this->color = $color;
    7.     }
    8.     abstract public function render();
    9. }
    Если и сейчас всё так же не понятно, то за учебники

    Добавлено спустя 2 минуты 32 секунды:
    https://php.net/manual/ru/language.oop5.basic.php - читайте до полного понимания. Ну хотя бы это
     
  23. ronnyhab

    ronnyhab Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    21
    Симпатии:
    0
    mkramer, спасибо, сейчас почитаю что вы посоветовали
     
  24. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    еще можно добавить

    abstract protected function render(Color $color, $width, $height);
    ...
    function __construct(Color $color, $width, $height) { 
     
  25. ronnyhab

    ronnyhab Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    21
    Симпатии:
    0
    Всем спасибо за советы, почитал что вы говорили, и вот что получилось,
    Код (Text):
    1. <?php
    2. class Color {
    3.     public $red;
    4.     public $green;
    5.     public $blue;
    6.  
    7.     public function __construct($red,$green,$blue){
    8.         $this->red = $red;
    9.         $this->green = $green;
    10.         $this->blue = $blue;
    11.  
    12.         $this->color = $this->red .",". $this->green .",". $this->blue;
    13.     }
    14.     public function __toString()
    15.     {
    16.         return $this->color;
    17.     }
    18. }
    19.  
    20. abstract class Component
    21. {
    22.     protected $color;
    23.     public function __construct($color)
    24.     {
    25.          $this->color = $color;
    26.     }
    27.     abstract public function render();
    28. }
    29.  
    30. class Rectangle extends Component {
    31.     public function __construct($color, $width, $height){
    32.         $this->color = $color;
    33.         $this->width = $width;
    34.         $this->height = $height;
    35.     }
    36.  
    37.     public function render(){
    38.         echo "<pre><div style=\"background-color:rgb($this->color);width:$this->width;height:$this->height\"></pre></div>";
    39.     }
    40. }
    41.  
    42. $color = new Color(127,0,0);
    43. $rect = new Rectangle($color, 100, 50);
    44. $rect->render()
    Скажите, пожалуйста, насколько написанное мной соответствует первой части задания. Заранее спасибо