Форум: "Основная";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];
ВнизСкрыть public-метод в наследнике. Найти похожие ветки
← →
Alexander Panov © (2005-05-30 20:10) [0]Как можно скрыть public-метод в наследнике класса?
К примеру, TStringList имеет 2 метода - Add и AddObject.
Как сделать невидимым для наследника метод Add?
← →
Гаврила © (2005-05-30 20:12) [1]В принципе никак не сделаешь.
Ибо всегда можно закастить под предка и вызвать метод
← →
Alexander Panov © (2005-05-30 20:14) [2]Гаврила © (30.05.05 20:12) [1]
А если без приведения типов?
Например:TGetList=class(TStringList)
private
function Add: Integer; reintroduce;
end;
В этом случае цель достигается, но получаем хинт, что метод нигде не используется.
← →
begin...end © (2005-05-30 20:16) [3]> Alexander Panov © (30.05.05 20:10)
Сужение области видимости невозможно. Если бы это было возможно, то и полиморфизма не было бы.
← →
Alexander Panov © (2005-05-30 20:17) [4]Ладно.
Спасибо всем.
Буду Exception выдавать в случае использования.
← →
Anatoly Podgoretsky © (2005-05-30 20:28) [5]Alexander Panov © (30.05.05 20:10)
И зачем? Психологичестки мешает? Если он виртуальный то сделай пустой в наследники, а также можно и скрыть через reintroduce
← →
Alexander Panov © (2005-05-30 20:33) [6]хм.
Я, наверное, немного ввел в заблуждение.
Хотел сказать - скрыть в наследнике от наследника.TGetList=class(TStringList)
private
function Add: Integer; reintroduce;
public
constructor Create;
end;
TGetChildList=class(TGetList)
end;
constructor TGetList.Create;
begin
Add;
end;
В принципе, если перенести метод в private-секцию, как заглушку и использовать при вызове, например, конструктора, то хинт выдаваться не будет.-)
И в наследнике не видно.
← →
Alexander Panov © (2005-05-30 20:35) [7]Anatoly Podgoretsky © (30.05.05 20:28) [5]
И зачем? Психологичестки мешает? Если он виртуальный то сделай пустой в наследники, а также можно и скрыть через reintroduce
А ведь пользователь класса ожидает, что метод работает по аналогии с родительским классом. Хотелось бы исключить любую ошибку.
← →
Anatoly Podgoretsky © (2005-05-30 20:37) [8]Alexander Panov © (30.05.05 20:35) [7]
Возбуди исключение, это самый нормальный метод. И документируй
← →
Alexander Panov © (2005-05-30 20:43) [9]Anatoly Podgoretsky © (30.05.05 20:37) [8]
Возбуди исключение, это самый нормальный метод. И документируй
А метод в [6] не подойдет?
← →
Чапаев © (2005-05-30 21:06) [10]Можно "предка" сделать приватным/защищённым полем "наследника" и делегировать нужные методы... Но это, конечно, не то, что хотел бы автор.
← →
Anatoly Podgoretsky © (2005-05-30 21:12) [11]Alexander Panov © (30.05.05 20:43) [9]
Я не понял его, особенно его вызов в Create.
Я никогда не пробовал сделать так, проверь сам пройдет или нет.
function Add: Integer; virtual; abstract; reintroduce;
Если получится то ты будешь иметь новую цепочку наследования и одновременно абстрактный метод, скрывающий метод предка.
← →
Alexander Panov © (2005-05-30 21:28) [12]Anatoly Podgoretsky © (30.05.05 21:12) [11]
такая цепочка не проходит, к сожалению.
← →
Anatoly Podgoretsky © (2005-05-30 21:32) [13]А жаль, я так надеялся. Ну тогда без abstract
← →
Defunct © (2005-05-30 21:41) [14]Извиняюсь за возможную грубость.
> В этом случае цель достигается, но получаем хинт
Ой ли, а не пофигу на тот хинт?
← →
BFG9k © (2005-05-30 21:43) [15]
> В принципе, если перенести метод в private-секцию, как заглушку
> и использовать при вызове, например, конструктора, то хинт
> выдаваться не будет
Дался тебе этот хинт. Хинты - обычное дело. Например при любом использовании PChar дельфи ругается - unsafe type. У нас своя голова за плечами :)
← →
Alexander Panov © (2005-05-30 21:44) [16]Defunct © (30.05.05 21:41) [14]
Ой ли, а не пофигу на тот хинт?
BFG9k © (30.05.05 21:43) [15]
Дался тебе этот хинт. Хинты - обычное дело. Например при любом использовании PChar дельфи ругается - unsafe type. У нас своя голова за плечами :)
У меня перед релизом не остается хинтов в программе.
← →
Defunct © (2005-05-30 21:46) [17]Alexander Panov © (30.05.05 21:44) [16]
Ясно, значит дело принципа ;>
и Pointer вы никогда не используете и PChar?
← →
Alexander Panov © (2005-05-30 21:49) [18]Defunct © (30.05.05 21:46) [17]
Использую, конечно.
← →
Defunct © (2005-05-30 22:09) [19]Alexander Panov © (30.05.05 21:49) [18]
А как же ж удается используя Pointer и PChar избегать всех hint"ов?
← →
Alexander Panov © (2005-05-30 22:21) [20]Defunct © (30.05.05 22:09) [19]
Приведи пример, в которм хинты выдаются?
← →
Defunct © (2005-05-30 22:40) [21]Alexander Panov © (30.05.05 22:21) [20]
const
Someconst : PChar = "А вот и хинт";
type
TSomerecord = Record
Addr : Pointer; // А вот и второй хинт
...
End;
Someproc = Procedure(Addr:Pointer); // третий хинт
Могу привести еще
← →
Alexander Panov © (2005-05-30 22:42) [22]Defunct © (30.05.05 22:40) [21]
Странно, у меня нет хинта ни в одном из 3-х примеров.
(D6)
← →
Гаврила © (2005-05-30 22:43) [23]Саш, хинт - не проблема, его можно погасить соответствующей директивой
{$HINTS OFF}
Я не совсем пойму - зачем это надо
2 Вопроса
1 кто будет пользоваться классом - потомком - ты или не ты?
2. метод статический или виртуальнй?
← →
Гаврила © (2005-05-30 22:46) [24]Если взять именно этот пример (Add, AddObject), то лучше наверно сделать так: переписать метод Add в секции паблик, но добавиьт параметр (сделать так же, как и в AddObject) (если например в стринг листе не должно оказаться итемов без обжектов)
← →
Defunct © (2005-05-30 22:46) [25]Alexander Panov © (30.05.05 22:42) [22]
Простите, Warning а не Hint в D7 звучит так:
1 - "Unsafe type PChar"
2 и 3 - "Unsafe type Pointer"
← →
Anatoly Podgoretsky © (2005-05-30 22:48) [26]Гаврила © (30.05.05 22:43) [23]
function Add(const S: string): Integer; override;
У предкаfunction Add(const S: string): Integer; virtual;
← →
Anatoly Podgoretsky © (2005-05-30 22:50) [27]Alexander Panov © (30.05.05 22:42) [22]
Появится в Д7, там это уже не безопасные типы, из-за .NET.
← →
Alexander Panov © (2005-05-30 22:51) [28]К сожаленю, я ошибся - спрятать метод все равно не удалось.
Это возможно только при условии вынесения предка в другой модуль, как я понял.
← →
Alexander Panov © (2005-05-30 22:53) [29]Ну что же, спасибо всем.
Похоже, что фокус не удастся.
---------
PS.
Гаврила © (30.05.05 22:43) [23]
1 кто будет пользоваться классом - потомком - ты или не ты?
Пользоваться буду я. Но ведь не надо зарекаться-)
← →
Anatoly Podgoretsky © (2005-05-30 22:56) [30]Ну спрятать невозможно по определению, можно начать новую цепочку наследования.
← →
Alexander Panov © (2005-05-30 22:59) [31]Anatoly Podgoretsky © (30.05.05 22:56) [30]
Да, увы мне-)
← →
Anatoly Podgoretsky © (2005-05-30 23:06) [32]Все таки так и осталось не понятным почему именно хочешь скрыть, ведь вполне достаточно изменить поведение, только надо учитывать и другие методы, например этот метод вызывает Insert который у предка как раз абстрактный, в отличии от Add, также еще есть и ряд других аналогичных методов.
Может надо подумать над перепроектированием? Что то хдесь не то, раз такое потребовалось.
← →
Alexander Panov © (2005-05-30 23:11) [33]Anatoly Podgoretsky © (30.05.05 23:06) [32]
Кратко опишу задачу:
Наследник от TStrinList используется для хранения списков объектов.
В наследнике объекты можно добавлять только методом AddObject(тоже переписанным).
← →
Alexander Panov © (2005-05-30 23:12) [34]Это делается для того, чтобы список формироваля строго по определенным правилам.
← →
Eraser © (2005-05-30 23:14) [35]Alexander Panov ©
А почему именно наследник от TStringList, а не TList например?
← →
Alexander Panov © (2005-05-30 23:17) [36]Eraser © (30.05.05 23:14) [35]
т
Мне необходимо наличие свойства Strings...
← →
Anatoly Podgoretsky © (2005-05-30 23:18) [37]Alexander Panov © (30.05.05 23:12) [34]
Почему бы не написать в наследнике методы, которые будут вызывать скажем исключение если они будут вызваны? Благо все они виртуальные или изменить их поведение, чтобы они следовали твоим требованиям. Ну не вижу острой необходимости скрывать.
← →
Alexander Panov © (2005-05-30 23:18) [38]Eraser © (30.05.05 23:14) [35]
По существу, в Strings хранятся ключи, по которым производится сортировка и поиск.
← →
Alexander Panov © (2005-05-30 23:19) [39]Anatoly Podgoretsky © (30.05.05 23:18) [37]
Анатолий, я уже понял, что не удастся скрыть-)
Поэтому последую твоему совету - перепишу метод с исключением.
← →
Anatoly Podgoretsky © (2005-05-30 23:22) [40]Alexander Panov © (30.05.05 23:19) [39]
Только просмотри все методы, чтобы не оказалось неожиданных обходных путей, например Delete ведь и удаление наверно должно следовать новому поведению. Все методы InsertXXX
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.041 c