Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
4-1114073934
Ярослав
2005-04-21 12:58
2005.06.14
Текс контрола другого приложения


1-1117050450
Борыч
2005-05-25 23:47
2005.06.14
Создание MDI-Child окна в режиме Visible=false (реанимация)


14-1117043795
Almaz
2005-05-25 21:56
2005.06.14
Оскорбления вместо помощи - где наше взаимоуважение ?


14-1117028731
Lexer
2005-05-25 17:45
2005.06.14
OR в C++ одним знаком


1-1117594686
sofs
2005-06-01 06:58
2005.06.14
CaretPos





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский