![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Скрыть public-метод в наследнике.
Alexander Panov © (2005-05-30 20:10:00)Как можно скрыть public-метод в наследнике класса?
К примеру, TStringList имеет 2 метода - Add и AddObject.
Как сделать невидимым для наследника метод Add?
Cobalt (2005-06-01 00:49:00) [1]2 Суслик © (31.05.05 19:53) [72]
Подробности можно?
* копаться в исходниках как-то лень...*
Суслик (2005-05-31 19:53:00) [2]Тут высказывалось отрицательное отношение к наследованию.
Не вижу ничего в нем плохого. ИМХО в дизайне должно быть все сбалансировано.
В качестве баланса могу привести в пример библиотеку "свинг" в java.
Полагаю, что реализованный у них подход по использованию полиформизма и наследования очень лаконичен.
Суслик (2005-05-31 19:28:00) [3]Если не ошибаюсь, то в плюсах можно именно прятать методы/конструкторы/деструкторы.
Anatoly Podgoretsky (2005-05-31 19:28:00) [4]Это если надо сделать иммитацию абстрактного метода или просто предотвратить неверное использование. Но все определяется задаче, я же подробностей не знаю.
Суслик (2005-05-31 19:26:00) [5]Я солидарен с [10] и [50]. Я бы сделал так. Если, конечно, Александру не нужно передавать свой список
куда-то, где ожидается интерфейс базового класса TStringList.
А вообще, все зависит от задачи, которая стоит перед Александром.
В некоторых случаях, я ничего плохого в совете Анатолия (возбуждать исключение) не вижу.
Anatoly Podgoretsky (2005-05-31 19:22:00) [6]pasha_golub © (31.05.05 19:11) [67]
Эта, никому не запрещено создавать ветки
pasha_golub (2005-05-31 19:11:00) [7]Эта, не убивайте ветку, плиз. У меня в свете этого обсуждения тоже вопрос. Просто сейчас некогда. ;0)
Игорь Шевченко (2005-05-31 14:33:00) [8]DiamondShark © (31.05.05 13:03) [65]
> Посмотрите лучше сюда:
Посмотрел. Но не могу сказать, насколько приживется.
DiamondShark (2005-05-31 13:03:00) [9]Из диалога с директором школы, получившим в подарок класс ДВК
- Посоветуйте, как нам получить от этого максимальную пользу.
- Этого я не могу. Но могу посоветовать, как получить от этого минимальный вред.
> Игорь Шевченко © (31.05.05 12:48) [64]
Это не то. Это из разряда "как с наименьшим гемороем пользоваться тем, что уже есть".
Посмотрите лучше сюда:
http://zonnon.ethz.ch/papers/Zonnon_Language_Report_v02r02_2_y041101.pdf
Игорь Шевченко (2005-05-31 12:48:00) [10]DiamondShark © (31.05.05 12:26) [63]
А вот народ пишет такое:
"Наследование является полезной концепцией программирования, но не всегда стоит прибегать к ней. Зачастую с подобными задачами лучше справляются интерфейсы. Данный раздел и раздел Случаи использования интерфейсовпомогут выбрать нужный подход.
Наследование лучше использовать в следующих случаях.
1.Иерархия наследования представляет собой отношения тождественности (is-a), а не отношения включения (has-a).
2.Можно повторно использовать код из базовых классов.
3.Необходимо применить тот же класс и методы к другим типам данных.
4.Иерархия класса содержит довольно мало уровней, и другие разработчики вряд ли будут добавлять в нее другие уровни.
5.Необходимо внести коренные изменения в производные классы путем изменения базового класса. "
http://msdn.microsoft.com/library/rus/default.asp?url=/library/rus/vbcn7/html/vaconwhenuseinheritance.asp
DiamondShark (2005-05-31 12:26:00) [11]
> Игорь Шевченко © (31.05.05 12:14) [61]
Отдельно, конечно.
Для полиморфизма есть своя чёткая, однозначная концепция -- реализация интерфейсов.
Для реюза -- тоже. Композиция.
Наследование, как оно существует в распространённых языках, слишком мутно и перегружено: оно одновременно и описание интерфейса, и реализация интерфейса и реюз кода.
Alexander Panov (2005-05-31 12:16:00) [12]begin...end © (31.05.05 12:12) [60]
StringList.CustomSort(...)
Я же не буду после каждой операции со списком CustomSort вызывать?
Игорь Шевченко © (31.05.05 12:14) [61]
А зачем тогда такой геморрой с скрытием метода Add ?
Это, в общем-то, был единственный непонятный на тот момент вопрос.-)
Игорь Шевченко (2005-05-31 12:14:00) [13]DiamondShark © (31.05.05 12:06) [58]
Вместе с полиморфизмом или отдельно ?
Alexander Panov © (31.05.05 12:09) [59]
> А как, например, изменить порядок сортировки в TStringList
> без наследования?
CustomSort вызывать ?
> Да и большинство свойств родительского кдасса используется
> по назначению.
А зачем тогда такой геморрой с скрытием метода Add ?
begin...end (2005-05-31 12:12:00) [14]> Alexander Panov © (31.05.05 12:09) [59]
> А как, например, изменить порядок сортировки в TStringList
> без наследования?
StringList.CustomSort(...)
:-)
Alexander Panov (2005-05-31 12:09:00) [15]Игорь Шевченко © (31.05.05 11:40) [57]
А как, например, изменить порядок сортировки в TStringList без наследования?
Да и большинство свойств родительского кдасса используется по назначению.
DiamondShark (2005-05-31 12:06:00) [16]Наследование должно сдохнуть.
Игорь Шевченко (2005-05-31 11:40:00) [17]Alexander Panov © (31.05.05 11:04) [56]
"Если родительский класс в большинстве случаев будет "подменять" своего потомка, то используется наследование. Если же родительский класс нужен лишь, чтобы класс-потомок мог использовать некоторые его свойства, то лучшим выбором будет композиция.
Одной фразой: чем больше класс-потомок похож на родительский класс, тем предпочтительнее использовать наследование, а не композицию."
Alexander Panov (2005-05-31 11:04:00) [18]Игорь Шевченко © (31.05.05 10:33) [55]
Не надо использовать наследование. Надо использовать композицию.
А чем лучше?
Впервые решил использовать наследование, а тут обломать хочешь намерение такое;)
Игорь Шевченко (2005-05-31 10:33:00) [19]Не надо использовать наследование. Надо использовать композицию.
Пост [50] наиболее подходящее решение.
Не надо путать программистов всякими reintroduce использующимися не по прямому назначению :)
Alexander Panov (2005-05-31 10:00:00) [20]Еще раз спасибо всем за обсуждение.