![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Скрыть public-метод в наследнике.
Alexander Panov © (2005-05-30 20:10:00)Как можно скрыть public-метод в наследнике класса?
К примеру, TStringList имеет 2 метода - Add и AddObject.
Как сделать невидимым для наследника метод Add?
Alexander Panov (2005-05-31 10:00:00) [21]VMcL © (31.05.05 7:32) [52]
Э-э-э.. так Вам шашечки или ехать? :-)
Если нужно по-честному именно скрыть, то делегирование, IMHO, один из лучших вариантов. Если не единственный.
Ну скрыть - это ведь побочная задача, и далеко не самая важная-)
Более приоритетная - удобство использования класса.
Поэтому - ну не удалось скрыть, ну и ладно-)
VMcL (2005-05-31 07:32:00) [22]>> Alexander Panov © (31.05.05 02:42) [51]
Э-э-э.. так Вам шашечки или ехать? :-)
Если нужно по-честному именно скрыть, то делегирование, IMHO, один из лучших вариантов. Если не единственный.
>> SergP © (31.05.05 02:04) [50]
См. [10]. "Всё уже украдено до нас" (c)
Alexander Panov (2005-05-31 02:42:00) [23]SergP © (31.05.05 2:04) [50]
Тогда придется переписывать методы для доступа к SL.
SergP (2005-05-31 02:04:00) [24]
> TGetList=class(TStringList)
> private
> function Add: Integer; reintroduce;
> end;
А если не делать TGetList наследником TStringlist? А сделать типа так:
TGetList=class
...
private
SL:TStringList;
...
end;
default (2005-05-31 00:29:00) [25]palva © (31.05.05 00:24) [48]
jack128 имеет ввиду что это работает только на стадии компиляции
"сместить" VMT для удаления закрываемого в потомке метода нельзя(по-хорошему) ибо весь полиморфизм работающий на этих VMT поломается
palva (2005-05-31 00:24:00) [26]jack128 © (31.05.05 00:09) [47]
Это - да. Меня просто смутило утверждение "Если бы это было возможно, то и полиморфизма не было бы" Честно говоря, смутно представляю себе, что такое полиморфизм, но в C++ это возможно.
jack128 (2005-05-31 00:09:00) [27]palva © (30.05.05 23:51) [46]
Если я передам в функцию, которая принемает a, объект реально являющийся b , то такая диагностика не работает..
palva (2005-05-30 23:51:00) [28]palva © (30.05.05 23:33) [45]
Поясню, хотя это, возможно, off topic
#include <iostream.h>
class a
{
public:
int i;
};
class b : a
{
public:
int j;
};
int main() {
b bb;
bb.j = 7;
bb.i = 8; // cannot access public member declared in class 'a'
cout << "adfasdf";
return 0;
}
Если написать публичное наследование (в делфи оно всегда публичное)
class b : public a
то диагностика исчезнет
palva (2005-05-30 23:33:00) [29]begin...end © (30.05.05 20:16) [3]
> Сужение области видимости невозможно. Если бы это было возможно, то и полиморфизма не было бы.
В языке C++ возможно при определении класса объявить тип наследования. Если он, к примеру, private то публичные методы наследуемого класса в наследующем становятся private.
Гаврила (2005-05-30 23:33:00) [30]Я в таком случае сделал бы по варианту [10].
Тем более, если планируется дальнейшее наращивание наследников
Alexander Panov (2005-05-30 23:25:00) [31]Eraser © (30.05.05 23:24) [42]
С TStringList как раз удобно тем, что не надо методы вытаскивать в свой модуль;)
Eraser (2005-05-30 23:24:00) [32]Alexander Panov © (30.05.05 23:18) [38]
Ситуация понятна, сам так частенько делаю, в Strings храню UID на объект, но с написанием своего класса не заморачивался...
Как вариант можно использовать IndexOfObject, но о сортировки тут конечно речь не идёт.
Вообще конечно универсальный вариант - наследовать TStrings, а нужные методы переносить Copy/Paste.
Alexander Panov (2005-05-30 23:23:00) [33]Anatoly Podgoretsky © (30.05.05 23:22) [40]
Ну пока вот так класс-наследник определен.
от него будут наследоваться уже остальные.
TMasterList=class(TStringList)
private
// FDB: IDBInterface; //Интерфейс для работы с БД
// FNet: INetInterface; //Интерфейс для работы с сетью
FG: TGuard; //Для работы с несколькими потоками
FSortDirect: Boolean;
FQuantity: Integer;
procedure Add; reintroduce;//Скрываем метод
procedure FreeObject(Index: Integer);
procedure CheckKey(aKey: String); //Проверка на пустой ключ
function GetKeys: TStringList;
function GetForumObject(Index: String): TForumObject;
procedure SetForumObject(Index: String; const Value: TForumObject);
procedure Enter;
procedure Leave;
// procedure CheckQuantity;
protected
function CompareStrings(const S1, S2: string): Integer; override; //Перекрыт для метода QuickSort
public
constructor Create; virtual;
destructor Destroy; override;
function AddObject(aForumObject: TForumObject): Integer; reintroduce;
procedure InsertObject(Index: Integer; aForumObject: TForumObject); reintroduce;
procedure Delete(Index: Integer); reintroduce; overload;
procedure Delete(aId: String); reintroduce; overload;
procedure Delete(aObject: TForumObject); reintroduce; overload;
function IndexOf(const S: string): Integer; override;
function Exists(aId: String): Boolean;
{
function DeleteFromDB(aId: String): Boolean; virtual;
function SyncToDB; virtual;
function SyncFromDB; virtual;
function SetObjectFromDB; virtual;
function AddObjectFromDB; virtual;
function WriteObjectToDB; virtual;
}
property Keys: TStringList read GetKeys;
property SortDirect: Boolean read FSortDirect write FSortDirect;
property ForumObject[Index: String]: TForumObject read GetForumObject write SetForumObject;
property Quantity: Integer read FQuantity write FQuantity;
end;
Anatoly Podgoretsky (2005-05-30 23:22:00) [34]Alexander Panov © (30.05.05 23:19) [39]
Только просмотри все методы, чтобы не оказалось неожиданных обходных путей, например Delete ведь и удаление наверно должно следовать новому поведению. Все методы InsertXXX
Alexander Panov (2005-05-30 23:19:00) [35]Anatoly Podgoretsky © (30.05.05 23:18) [37]
Анатолий, я уже понял, что не удастся скрыть-)
Поэтому последую твоему совету - перепишу метод с исключением.
Anatoly Podgoretsky (2005-05-30 23:18:00) [36]Alexander Panov © (30.05.05 23:12) [34]
Почему бы не написать в наследнике методы, которые будут вызывать скажем исключение если они будут вызваны? Благо все они виртуальные или изменить их поведение, чтобы они следовали твоим требованиям. Ну не вижу острой необходимости скрывать.
Alexander Panov (2005-05-30 23:18:00) [37]Eraser © (30.05.05 23:14) [35]
По существу, в Strings хранятся ключи, по которым производится сортировка и поиск.
Alexander Panov (2005-05-30 23:17:00) [38]Eraser © (30.05.05 23:14) [35]
т
Мне необходимо наличие свойства Strings...
Eraser (2005-05-30 23:14:00) [39]Alexander Panov ©
А почему именно наследник от TStringList, а не TList например?
Alexander Panov (2005-05-30 23:12:00) [40]Это делается для того, чтобы список формироваля строго по определенным правилам.