Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Скрыть public-метод в наследнике.


Страницы:   1 2 3 4

Alexander Panov ©   (2005-05-30 20:10:00) 

Как можно скрыть public-метод в наследнике класса?
К примеру, TStringList имеет 2 метода - Add и AddObject.
Как сделать невидимым для наследника метод Add?


Anatoly Podgoretsky   (2005-05-30 21:32:00) [61]

А жаль, я так надеялся. Ну тогда без abstract


Alexander Panov   (2005-05-30 21:28:00) [62]

Anatoly Podgoretsky ©   (30.05.05 21:12) [11]
такая цепочка не проходит, к сожалению.


Anatoly Podgoretsky   (2005-05-30 21:12:00) [63]

Alexander Panov ©   (30.05.05 20:43) [9]
Я не понял его, особенно его вызов в Create.
Я никогда не пробовал сделать так, проверь сам пройдет или нет.

function Add: Integer; virtual; abstract; reintroduce;

Если получится то ты будешь иметь новую цепочку наследования и одновременно абстрактный метод, скрывающий метод предка.


Чапаев   (2005-05-30 21:06:00) [64]

Можно "предка" сделать приватным/защищённым полем "наследника" и делегировать нужные методы... Но это, конечно, не то, что хотел бы автор.


Alexander Panov   (2005-05-30 20:43:00) [65]

Anatoly Podgoretsky ©   (30.05.05 20:37) [8]
Возбуди исключение, это самый нормальный метод. И документируй


А метод в [6] не подойдет?


Anatoly Podgoretsky   (2005-05-30 20:37:00) [66]

Alexander Panov ©   (30.05.05 20:35) [7]
Возбуди исключение, это самый нормальный метод. И документируй


Alexander Panov   (2005-05-30 20:35:00) [67]

Anatoly Podgoretsky ©   (30.05.05 20:28) [5]
И зачем? Психологичестки мешает? Если он виртуальный то сделай пустой в наследники, а также можно и скрыть через reintroduce


А ведь пользователь класса ожидает, что метод работает по аналогии с родительским классом. Хотелось бы исключить любую ошибку.


Alexander Panov   (2005-05-30 20:33:00) [68]

хм.
Я, наверное, немного ввел в заблуждение.
Хотел сказать -  скрыть в наследнике от наследника.

TGetList=class(TStringList)
private
function Add: Integer; reintroduce;
public
constructor Create;
end;

TGetChildList=class(TGetList)
end;

constructor TGetList.Create;
begin
 Add;
end;



В принципе, если перенести метод в private-секцию, как заглушку и использовать при вызове, например, конструктора, то хинт выдаваться не будет.-)
И в наследнике не видно.


Anatoly Podgoretsky   (2005-05-30 20:28:00) [69]

Alexander Panov ©   (30.05.05 20:10)  
И зачем? Психологичестки мешает? Если он виртуальный то сделай пустой в наследники, а также можно и скрыть через reintroduce


Alexander Panov   (2005-05-30 20:17:00) [70]

Ладно.
Спасибо всем.
Буду Exception выдавать в случае использования.


begin...end   (2005-05-30 20:16:00) [71]

> Alexander Panov ©   (30.05.05 20:10)

Сужение области видимости невозможно. Если бы это было возможно, то и полиморфизма не было бы.


Alexander Panov   (2005-05-30 20:14:00) [72]

Гаврила ©   (30.05.05 20:12) [1]

А если без приведения типов?
Например:

TGetList=class(TStringList)
private
 function Add: Integer; reintroduce;
end;


В этом случае цель достигается, но получаем хинт, что метод нигде не используется.


Гаврила   (2005-05-30 20:12:00) [73]

В принципе никак не сделаешь.
Ибо всегда можно закастить под предка и вызвать метод


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо