![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Скрыть public-метод в наследнике.
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]В принципе никак не сделаешь.
Ибо всегда можно закастить под предка и вызвать метод