Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Наследование и полиформизм
 
 автор: jonik   (28.02.2012 в 12:21)   письмо автору
 
 

Добрый день! Хотелось бы узнать правила хорошего тона при проектировании классов.

Итак имеем......

abstract class a{
// поля класса

function method a(){
какие-то действия
}

function method b(){
еще какие-то действия
}

}


сlass b extends a(){
// поля класса
function method a(){
допустим нам подойдет базовый метод, посему parent:: method a;
}

function method b(){
а вот этот метод, например, полностью переопределяем......
}
}


// Пока все хорошо, но вот у нас появляется засадный класс №1......


class c extends a(){

function method a(){
в этом классе method a мы переопреедлим)))));
}

Вопрос №1
Предположим, что в этом классе нам не нужен вообще method b. Что делать в этом случае?
ничего не писать, но будет же доступен родительский method b, или может быть просто поставить его заглушку (хотя это больше для абстрактного метода подходит)? Как этот вопрос решается в приличном обществе?

}



// Теперь появляется засадный класс №2......





class d extends a(){

function method a(){
в этом классе method a оставим parent:: method a;
}


Вопрос №2
А теперь засада....... тут у нас вознилка необходимость внедрить method с, который будет использовать только этот класс. Как поступить????? внедрить его и в базовый класс, но тогда получается, что в базовом классе сидит метод, который будет использоваться только в одном производном классе. Нормально ли это?????? ИЛи это сигнал к тому, чтобы начинать новую цепочку наследования с нового базового класса?

}

Вопрос №3 касается повторного использования кода....... Предположим, что в классе-насоледнике мы переопрелделяем какой-то метод. Проблема в том, что его отличие от базового метода заключается лишь в одной строчке.... напрмиер в sql-запросе..... Все остальное дико одинаково и даже запрос возвращает данные одного типа...... просто на уровне SQL-процедуры есть различия, которые никак не влияют на дальнейшую обработку в PHP.....

С одной стороны переписывать на 99% одинаковый код кажетсья глупым. Есть кончено вариант, это строку sql-запроса передавать в качестве параметра в методы и тогда переопределять метод нет смысла и будем пользоваться базовым методом, просто с другим входным параметром. Но вопрос... Хорошо ли это?... Как обычно поступают в таком случае?

  Ответить  
 
 автор: cheops   (28.02.2012 в 14:20)   письмо автору
 
   для: jonik   (28.02.2012 в 12:21)
 

>Вопрос №1
>Предположим, что в этом классе нам не нужен вообще method b. Что делать в этом случае?
Встречный вопрос, если он не нужен, да так не нужен, что даже его присутствие отравляет все удовольствие и мешает работать, что же этот метод делает в абстрактном классе? Пусть он в классе-потомке b появляется, а в классе-родителе a его вообще не будет.

>Вопрос №2
>А теперь засада.......
Никакой засады не вижу... просто создаете новый метод c в классе-потомке. У наших общих с обезьянами предков вообще не было речевого аппарата, нам он в ходе эволюции потребовался, мы его завели, а обезьяны - нет. Вы хотя бы одного связно-говорящего зверя видели с письменностью? Мы первые завели этот метод, хотя других возможностей унаследовали вагон и маленькую тележку (начиная с механизма размножения, заканчивая позвоночником и зрением). Другие себе электрически хвосты и радары заводят (а у нас допустим электрического хвоста нет, хотя у ряда потомков наших общих предков он есть, а у базовых одноклеточных и хвостов никаких не было, тем более электрических)... Тут тоже самое, нужен вам метод, которого у предков не было - заводите не раздумывая. В этом смысл наследования, что потомки более сложные, более специализированные и имеют больше методов (им просто не нужно снова придумывать/реализовывать то, что и так уже есть у предков).

  Ответить  
 
 автор: jonik   (28.02.2012 в 14:39)   письмо автору
 
   для: cheops   (28.02.2012 в 14:20)
 

>>Встречный вопрос, если он не нужен, да так не нужен, что даже его присутствие отравляет все удовольствие и мешает работать, что же этот метод делает в абстрактном классе? Пусть он в классе-потомке b появляется, а в классе-родителе a его вообще не будет.
>
Ну тут я просто написал мало..... Скажем так.... в 12 методах потомках он используется, он в 3-х нет... т.е. он нужен в базовом классе........


>>Тут тоже самое, нужен вам метод, которого у предков не было - заводите не раздумывая. В этом смысл наследования, что потомки более сложные, более специализированные и имеют больше методов (им просто не нужно снова придумывать/реализовывать то, что и так уже есть у предков).
>

ОППА........ я относительно недавно имею дело с наследованием, но... почему-то был уверен, что в потомке не может содержатсья метода, которого нет в родителе.... Понимаю, звучит глупо, но написав один раз такой класс, и добавив туда метод, которого нет у родителя, при его вызове вылезала ошибка, про то, что немогу заргузить метод, т.к. его нет в классе, и ссылка на базовый класс....... Наврено глюк, но елси потомок может иметь метод, которого нет у родителя - так это шикарно просто и куча вопросов сразу отпала........ хотя вопросик №3 меня волнует сильно)))

  Ответить  
 
 автор: cheops   (28.02.2012 в 14:55)   письмо автору
 
   для: jonik   (28.02.2012 в 12:21)
 

>Вопрос №3 касается повторного использования кода.......
Не стесняйтесь вводить protected-методы, и вводить для них public-обертки, создайте метод, который повторяет все, что у вас с базовом методе, только SQL-запрос он получает в качестве параметра и вызывайте его вместо того, кода, что у вас сейчас. Тогда в методе наследнике вам можно будет вызвать точно такой же метод базового класса, передав ему в качестве параметра новый SQL-запрос. Не церемоньтесь с вводом новых методов :)))

  Ответить  
 
 автор: jonik   (28.02.2012 в 15:12)   письмо автору
 
   для: cheops   (28.02.2012 в 14:55)
 

Спасибо огромное за ответы....... много нового открыл для себя.... Вот про паблик-обертки даже не думал, а ведь это гениально и просто))))))))

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования