Как задать общие свойства в подклассах?


Я новичок в программировании OO, и я пытаюсь понять, как правильно присваивать значения общим свойствам из подклассов. Я всегда в конечном итоге делаю это по-разному каждый раз, поэтому я подумал, что было бы неплохо спросить вас, как вы обычно делаете.

Предположим, что у меня есть родительский классFruit и два подклассаApple иBanana .

abstract class Fruit {

    protected $color; //empty property

    protected function getColor(){
        return $this->color;
    }
}

class Apple extends Fruit {
    protected $color = 'red';
}

class Banana extends Fruit {
    protected $color = 'yellow';
}

?>

Каждый подкласс должен иметь свойство color , которое будет использоваться к примеру, функция getColor в суперклассе.

Но как мне поступить с собственностью?

  1. Я определяю пустую переменную $color в Родительском файле. Затем я устанавливаю переменную $color в подклассах и передаю их в родительскую конструкцию parent by parent::__, чтобы присвоить значение свойству в родительской конструкции.

  2. Я определяю пустую переменную $color в Родительском файле. Затем я просто использую $this - > color в подклассе, чтобы установить значение.

  3. Я определяю свойство в каждом подклассе и оставляю его таким. Унаследованные методы все еще могут использовать его.

Я хотел бы думать, что лучше всего собирать общие свойства в родительском классе, но это просто кажется излишним, чтобы написать так много строк, чтобы установить несколько значений (и если у меня есть много свойств, будет также много параметров функции). Номер два и три работает, но трудно понять, что мне на самом деле нужно определить свойство в все.

Как я должен думать здесь? Я так запутался в образе мышления ОО, что почти не пишу кода, ха-ха.

Спасибо.

3   4  
2011-06-07 01:17:19

3 ответа:

Нет никакой "серебряной пули". В общем случае все поля, которые, как ожидается, будут отличаться в подклассах, должны быть установлены через параметры конструктора, чтобы гарантировать, что они явно установлены. Другие поля могут быть инициализированы путем присвоения значений свойствам.

Например, цвет плода может быть задан путем присвоения значения свойству (поскольку многие плоды могут быть красными), но имя должно быть задано параметром конструктора (поскольку имя однозначно идентифицирует фрукты).

Все ваши дочерние классы наследуют свойство color. Ключевое слово protected гарантирует, что оно передается по наследству детям, но недоступно для внешнего мира. Вам не нужно объявлять $this->color в ваших дочерних классах, поскольку он уже существует, назначьте $this->color значение в методе внутри дочернего класса, который у вас есть.

Лучший способ показан в ваших списках-присвоить свойству класса значение по умолчанию. Но я, вероятно, использую некоторую идею внедрения зависимостей в ваш код и просто передам значение по умолчанию конструктору.