|
|
|
| Добрый день! Хотелось бы узнать правила хорошего тона при проектировании классов.
Итак имеем......
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-запроса передавать в качестве параметра в методы и тогда переопределять метод нет смысла и будем пользоваться базовым методом, просто с другим входным параметром. Но вопрос... Хорошо ли это?... Как обычно поступают в таком случае? | |
|
|
|
|
|
|
|
для: jonik
(28.02.2012 в 12:21)
| | >Вопрос №1
>Предположим, что в этом классе нам не нужен вообще method b. Что делать в этом случае?
Встречный вопрос, если он не нужен, да так не нужен, что даже его присутствие отравляет все удовольствие и мешает работать, что же этот метод делает в абстрактном классе? Пусть он в классе-потомке b появляется, а в классе-родителе a его вообще не будет.
>Вопрос №2
>А теперь засада.......
Никакой засады не вижу... просто создаете новый метод c в классе-потомке. У наших общих с обезьянами предков вообще не было речевого аппарата, нам он в ходе эволюции потребовался, мы его завели, а обезьяны - нет. Вы хотя бы одного связно-говорящего зверя видели с письменностью? Мы первые завели этот метод, хотя других возможностей унаследовали вагон и маленькую тележку (начиная с механизма размножения, заканчивая позвоночником и зрением). Другие себе электрически хвосты и радары заводят (а у нас допустим электрического хвоста нет, хотя у ряда потомков наших общих предков он есть, а у базовых одноклеточных и хвостов никаких не было, тем более электрических)... Тут тоже самое, нужен вам метод, которого у предков не было - заводите не раздумывая. В этом смысл наследования, что потомки более сложные, более специализированные и имеют больше методов (им просто не нужно снова придумывать/реализовывать то, что и так уже есть у предков). | |
|
|
|
|
|
|
|
для: cheops
(28.02.2012 в 14:20)
| | >>Встречный вопрос, если он не нужен, да так не нужен, что даже его присутствие отравляет все удовольствие и мешает работать, что же этот метод делает в абстрактном классе? Пусть он в классе-потомке b появляется, а в классе-родителе a его вообще не будет.
>
Ну тут я просто написал мало..... Скажем так.... в 12 методах потомках он используется, он в 3-х нет... т.е. он нужен в базовом классе........
>>Тут тоже самое, нужен вам метод, которого у предков не было - заводите не раздумывая. В этом смысл наследования, что потомки более сложные, более специализированные и имеют больше методов (им просто не нужно снова придумывать/реализовывать то, что и так уже есть у предков).
>
ОППА........ я относительно недавно имею дело с наследованием, но... почему-то был уверен, что в потомке не может содержатсья метода, которого нет в родителе.... Понимаю, звучит глупо, но написав один раз такой класс, и добавив туда метод, которого нет у родителя, при его вызове вылезала ошибка, про то, что немогу заргузить метод, т.к. его нет в классе, и ссылка на базовый класс....... Наврено глюк, но елси потомок может иметь метод, которого нет у родителя - так это шикарно просто и куча вопросов сразу отпала........ хотя вопросик №3 меня волнует сильно))) | |
|
|
|
|
|
|
|
для: jonik
(28.02.2012 в 12:21)
| | >Вопрос №3 касается повторного использования кода.......
Не стесняйтесь вводить protected-методы, и вводить для них public-обертки, создайте метод, который повторяет все, что у вас с базовом методе, только SQL-запрос он получает в качестве параметра и вызывайте его вместо того, кода, что у вас сейчас. Тогда в методе наследнике вам можно будет вызвать точно такой же метод базового класса, передав ему в качестве параметра новый SQL-запрос. Не церемоньтесь с вводом новых методов :))) | |
|
|
|
|
|
|
|
для: cheops
(28.02.2012 в 14:55)
| | Спасибо огромное за ответы....... много нового открыл для себя.... Вот про паблик-обертки даже не думал, а ведь это гениально и просто)))))))) | |
|
|
|
|