За последние 24 часа нас посетили 15485 программистов и 1606 роботов. Сейчас ищут 925 программистов ...

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

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

  1. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    По заданию Component должно быть "поля width и heigth типа int.", а у тебя в Rectangle эти поля
     
  2. ronnyhab

    ronnyhab Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    21
    Симпатии:
    0
    то есть я должен добавить эти поля в класс Component и удалить их из Rectangle?
     
  3. denis01

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

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

    ronnyhab Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    21
    Симпатии:
    0
    подскажите, пожалуйста, как их тогда передать в класс Rectangle? не совсем понимаю
     
  5. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Rectangle наследует Component
    Если в Component есть protected $color;
    То в экземпляре класса Rectangle будет доступна $this->color так как он наследует Component в котором тоже есть $this->color
     
  6. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Объявите в Component поля $width и $height, тоже protected, и перенесите в конструктор Component их инициализацию. Я просто невнимательно эту часть задания прочёл. Конструктор Rectangle тогда вообще убрать можно - достаточно будет унаследованного от Component. и вообще, хотя PHP и позволяет не объявлять заранее свойства (т.е. ваш код работоспособен), лучше это делать, поскольку так программа будет более читаемой. А так да, это уже вполне сойдёт за правду
     
  7. ronnyhab

    ronnyhab Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    21
    Симпатии:
    0
    спасибо вам за советы. извините за невнимательность с protected. в итоге вот что получил
    Код (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.     protected $width;
    24.     protected $height;
    25.  
    26.     abstract public function render();
    27. }
    28.  
    29. class Rectangle extends Component {
    30.     public function __construct($color, $width, $height){
    31.         $this->color = $color;
    32.         $this->width = $width;
    33.         $this->height = $height;
    34.     }
    35.  
    36.     public function render(){
    37.         echo "<pre><div style=\"background-color:rgb($this->color);width:$this->width;height:$this->height\"></pre></div>";
    38.     }
    39. }
    40.  
    41. $color = new Color(127,0,0);
    42. $rect = new Rectangle($color, 100, 50);
    43. $rect->render();
     
  8. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    тогда добавьте еще в класс Color
    public $color;
    а то используете свойство но оно не объявлено у вас.
     
  9. ronnyhab

    ronnyhab Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    21
    Симпатии:
    0
    runcore, добавил, спасибо.
    Хотел бы еще уточнить пару моментов - во второй части задание есть такой пункт:
    если я к примеру реализую это так, будет ли это нормальной практикой, либо это можно выполнить более правильно:
    Код (Text):
    1. class Rectangle extends Component {
    2.     public function __construct($color, $width, $height){
    3.         $this->color = $color;
    4.         $this->width = $width;
    5.         $this->height = $height;
    6.     }
    7.  
    8.     public function render(){
    9.         echo "<pre><div style=\"background-color:rgb($this->color);width:$this->width;height:$this->height\"></pre></div>";
    10.  
    11.     }
    12. }
    13.  
    14. class BorderedRectangle extends Rectangle {
    15.     protected $bcolor;
    16.     public function __construct($color, $width, $height, $bcolor){
    17.         $this->color = $color;
    18.         $this->width = $width;
    19.         $this->height = $height;
    20.         $this->bcolor = $bcolor;
    21.     }
    22.  
    23.     public function bRectangle(){
    24.         echo "<pre><div style=\"background-color:rgb($this->color);width:$this->width;height:$this->height;border: 5px solid $this->bcolor;\"></pre></div>";
    25.     }
    26. }
    Второй момент, также по заданию:
    Не совсем понял задание, что нужно почитать для выполнения?
     
  10. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    -цвет фона лучше задавайте через вызов отдельного метода. типа
    public function setBgColor(Color $color) {

    тоесть получается что конструктор будет унаследованный от класса Rectangle. а в классе наследнике нужно будет только добавить ИМЕННО то чем он отличается от предка. свойство и метод для его установки, и render. НО тут есть еще тонкость. полностью дублировать метод рендер нет необходимости. подумайте как это сделать. если не придумаете - подскажем

    Добавлено спустя 1 минуту 59 секунд:
    что непонятного?
    вы передаете ему в конструкторе массив разных прямоугольников с разными свойствами. а он по очереди их отрисовывает.
     
  11. ronnyhab

    ronnyhab Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    21
    Симпатии:
    0
    Все понял, спасибо, буду кумекать
     
  12. ronnyhab

    ronnyhab Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    21
    Симпатии:
    0
    Всем доброго дня.
    Оказалось не все так понятно. Component - абстрактный класс, т.е. мы не можем создать его экземпляр. Значит нам надо передавать в конструктор нового класса массив экземпляров класса Rectangle, в котором содержится реализация класса Component?
    Примерно так?
    Код (Text):
    1. class Renderer {
    2.     public $arr;
    3.     public function __construct($arr){
    4.         $this->arr = $arr;
    5.     }
    6.     public function showRecs(){
    7.     }
    8. }
    9.  
    10.  
    11.  
    12.  
    13. $color = new Color(127,0,0);
    14. $rect = new Rectangle($color, 100, 50);
    15. $brect = new BorderedRectangle($color, 100, 50, 'yellow');
    16.  
    17. $rect->render();
    18. $brect->bRectangle();
    19.  
    20. $color1 = new Color(0,0,0);
    21. $rect1 = new Rectangle($color1, 100, 50);
    22.  
    23. $color2 = new Color(100,0,0);
    24. $rect2 = new Rectangle($color2, 100, 50);
    25.  
    26. $arr = array($rect, $rect1, $rect2);
    27.  
    28. $rend = new Renderer($arr);
    29. $rend->showRecs();
    И как обрабатывать сами объекты?
     
  13. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    Да, Component абстрактный. но все его потомки (Rectangle например) уже реальные.
    внутри Renderer нужно проверить что в массиве лежат объекты которые являются наследниками от Component. это будет гарантировать что у них есть метод render() и значит вызывая его можно активировать отрисовку каждого объекта.
    читать про instanceof.
     
  14. ronnyhab

    ronnyhab Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    21
    Симпатии:
    0
    runcore, еще раз спасибо вам за помощь, вот что получилось у меня
    Код (Text):
    1. class Renderer {
    2.     public $arr;
    3.     public function __construct($arr){
    4.         $this->arr = $arr;
    5.     }
    6.     public function showRecs(){
    7.         foreach ($this->arr as $key => $value) {
    8.             $isRectangle = ($value instanceof Rectangle);
    9.             if ($isRectangle == 1) {
    10.                 $value->render();
    11.             }
    12.         }
    13.     }
    14. }
    15.  
    16. $color = new Color(127,0,0);
    17. $rect = new Rectangle($color, 100, 50);
    18. $brect = new BorderedRectangle($color, 100, 50, 'yellow');
    19.  
    20. $rect->render();
    21. $brect->bRectangle();
    22.  
    23. $color1 = new Color(0,127,0);
    24. $rect1 = new Rectangle($color1, 100, 50);
    25.  
    26. $color2 = new Color(0,0,127);
    27. $rect2 = new Rectangle($color2, 100, 50);
    28.  
    29. $arr = array($rect, $rect1, $rect2);
    30.  
    31. $rend = new Renderer($arr);
    32. $rend->showRecs();
    похоже на правду?
     
  15. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    похоже.
    только вам же нужно проверять что объект от класса Component? Так же вроде в задании.
    тогда так
    $isComponent = ($value instanceof Component);
     
  16. ronnyhab

    ronnyhab Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    21
    Симпатии:
    0
    вы правы, поспешил.
     
  17. ronnyhab

    ronnyhab Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    21
    Симпатии:
    0
    еще уточнение по поводу
    то есть я делаю
    Код (Text):
    1. class Rectangle extends Component {
    2.     public function __construct($color, $width, $height){
    3.         $this->color = $color;
    4.         $this->width = $width;
    5.         $this->height = $height;
    6.     }
    7.  
    8.     public function render(){
    9.         echo "<pre><div style=\"background-color:rgb($this->color);width:$this->width;height:$this->height\"></pre></div>";
    10.  
    11.     }
    12. }
    13.  
    14. class BorderedRectangle extends Rectangle {
    15.     protected $bcolor;
    16.     public function __construct($bcolor){
    17.         parent::__construct();
    18.         $this->bcolor = $bcolor;
    19.     }
    20.     public function bRectangle(){
    21.         echo "<pre><div style=\"background-color:rgb($this->color);width:$this->width;height:$this->height;border: 5px solid $this->bcolor;\"></pre></div>";
    22.     }
    23. }
    или я что-то недопонял?
     
  18. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    конструктор в BorderedRectangle вообще можете не писать. но будет унаследован от Rectangle.
    цвет бордера можно задавать отдельным методом. я же писал об этом уже.
     
  19. ronnyhab

    ronnyhab Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    21
    Симпатии:
    0
    так, вроде получилось
    Код (Text):
    1.  
    2. class BorderedRectangle extends Rectangle {
    3.     protected $bcolor;
    4.     public function setBgColor($bcolor) {
    5.         $this->bcolor = $bcolor;
    6.     }
    7.  
    8.     public function render(){
    9.         echo "<pre><div style=\"background-color:rgb($this->color);width:$this->width;height:$this->height;border: 5px solid rgb($this->bcolor);\"></pre></div>";
    10.     }
    11. }
    12. echo "Bordered Rectangle: ";
    13. $brect = new BorderedRectangle($color, 100, 50);
    14. $bcolor = new Color(127,127,127);
    15. $brect->setBgColor($bcolor);
    16. $brect->render();