Какой из этих методов наследования является лучшей практикой? - PullRequest
1 голос
/ 02 июля 2010

Допустим, у меня есть что-то вроде этого:

abstract class Parent
{
    protected function foobar($data)
    {
        //do something with data
        return $result;
    }
} 

class Child extends Parent
{
    public function foobar()
    {
        $data = ...;

        return parent::foobar($data);
    }
}

Как вы можете видеть, foobar обычно определяется в Parent, а затем Child передает специфичные для класса данные в родительский объект, которыйвозвращает результат.Причина этого заключается в том, что каждый дочерний класс parent имеет свои собственные данные, но сам метод остается тем же - отличается только параметр.Ребенок также публично раскрывает метод.

Лучше ли сделать что-то вроде этого, где я создаю метод с одинаковым именем как в родительском, так и в дочернем элементах?Или мне следует создать метод _foobar в классе Parent и просто вызвать вызов метода Child foobar?

Ответы [ 3 ]

2 голосов
/ 02 июля 2010

Принцип замены Лискова гласит:

Если для каждого объекта o1 типа S существует объект o2 типа T такой, что для всех программ P, определенных вВ терминах T поведение P остается неизменным, когда o1 заменяется на o2, тогда S является подтипом T. "

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

В вашем примере вы нарушаете это, изменяя сигнатуру метода foobar (переопределение). foobar должен иметь такую ​​же сигнатуру для внешнего мира, он может что-то сделатьотличается от родственного намерения. Если вам нужна другая функция, тогда назовите ее как-то иначе, Ваш ребенок больше не станет Иса Родителя.

2 голосов
/ 02 июля 2010

Прежде всего, нет причин для общего именования. Назовите родительский что-то вроде «doFoobarOnGivenData» (вы понимаете, мой дрейф).

Кроме того, все ли дети имеют одинаковый код или данные по-разному запрашиваются для каждого? Возможно, было бы лучше иметь один общедоступный метод foobar в родительском объекте, который вызывал бы абстрактный «getDataForFoobar». В этом случае каждому ребенку придется только переопределить способ получения данных.

1 голос
/ 02 июля 2010

Это больше вопрос создания перегрузки по сравнению с использованием метода с похожим (но другим) именем. На этот вопрос нет настоящего «правильного» ответа, хотя я предпочитаю перегрузку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...