Как спроектировать наследование с изменением типов параметров в php? - PullRequest
0 голосов
/ 29 января 2010

Идея состоит в том, чтобы создать DOM-подобное дерево. Но есть некоторые ограничения, что только некоторые типы могут содержать другие.

Я хочу использовать интерфейс | абстрактный класс | суперкласс для реализации некоторых хорошо известных js-функций, таких как appendChild, replaceChild и т. Д.

Я использую страницу классов, блок и элемент, где страницы могут содержать блоки, а блоки могут содержать либо блоки, либо элементы.

Пример: страница - это веб-страница, блок может быть элементом списка, а элемент может быть элементом элемента списка.

Но эти объекты содержат больше, чем просто html-данные, и концепции выходят за рамки простого представления HTML. Это общая идея управления элементами, независимо от того, имеют ли они фактическое представление или являются просто абстрактными объектами. Сама концепция работает для многих различных иерархий.

Чего я хочу добиться, так это повторно использовать как можно больше кода родительского класса (добавление дочернего элемента в основном одинаково для всех классов), но различать подсказки типов для соответствия разрешенным типам, добавляемым как дочерний. 1013 *

Есть четыре основных способа, которыми я себя узнал:

  1. Я использую интерфейс, который позволяет мне вводить подсказки для суперкласса, но не изменять их.
  2. Я использую суперкласс с открытыми методами, чтобы я мог переопределить подсказки типов (что полностью противоречит обычной практике при наследовании предварительных условий).
  3. Я использую суперкласс с защищенными методами, который кажется довольно странным.
  4. Я избавляюсь от любого суперкласса и просто определяю почти один и тот же класс несколько раз.
  5. Я использую метод для проверки типа, несмотря на возможность подсказок типа.

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

И если я что-то пропустил, я рад это слышать;)

Код

Способ суперкласса (работает, но нарушает практику наследования предусловий)

class Base {

    public|protected function appendChild(Base $child) {
        // do stuff
    }
}

class Block extends Base {

   public function appendChild(Block $child) {
       parent::appendChild($child);
   }

}

Способ интерфейса (не работает. Не должен)

interface Interface1 {

    public function appendChild(Base $child);

}

class Base implements Interface1 {

    public|protected function appendChild(Base $child) {
        // do stuff
    }
}

class Block extends Base{

   public function appendChild(Block $child) {
       parent::appendChild($child);
   }

}

Отредактированные части выделены жирным шрифтом

1 Ответ

0 голосов
/ 29 января 2010

Интерфейс имеет наибольшее значение для меня. У вас может быть один класс, который играет несколько ролей, поскольку он может реализовывать несколько интерфейсов.

// you don't need any methods in the interfaces
class Foo implements Inline, Block {} 

будет работать с обоими:

appendChild(Inline $foo); and appendChild(Block $foo);

и интерфейсы могут расширять друг друга, поэтому может быть общий интерфейс для всех ваших объектов.

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

Если бы не интерфейсы, я бы выбрал вариант 5: просто наберите appendChild call $child->canBeChildOf($this) и / или $this->accepts($child). Опять же, логика и реализация будут независимы, и вы будете иметь большую свободу с вашей логикой.

PHP выполняет проверки типов при запуске tmie, так что использование системы типов в любом случае вам мало что дает.

...