Вниз
Скачать: CL | DM;

Скрыть 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 вся ветка

Скачать: CL | DM;



Память: 0.54 MB
Время: 0.027 c
11-1098258673
IceMan
2004-10-20 11:51
2005.06.14
Как перевести строку в функцию


11-1098279058
Unknown Mystic
2004-10-20 17:30
2005.06.14
Текстовые файлы.


1-1117346604
Aldor
2005-05-29 10:03
2005.06.14
Чтение свойства - всем, запись - только потомкам


4-1114073734
EthernalWonderer
2005-04-21 12:55
2005.06.14
Получение системного формата даты


3-1115511543
UserCP
2005-05-08 04:19
2005.06.14
Как вставить и прочитать в MSSQL графическое изображение?




   Наверх