Форум: "Основная";
Текущий архив: 2003.09.08;
Скачать: [xml.tar.bz2];
ВнизКласс-оболочка в каждой форме, исходный - один в главной Найти похожие ветки
← →
unreger (2003-08-26 06:25) [40]Наследование не устраивает тем, что не хочется наследовать поля класса, например, то поле, в котором хранится соединение должно быть одно для всего проекта, а все функции класса используют его.
Для каждого экземпляра TCDataWrapper будет вызываться конструктор предка для инициализации этого поля, что приведет к открытию нового соединения. Нельзя.
Тогда можно, конечно, в CDataWrapper хранить ссылку на это поле, вернее ссылку на объект, туда же, куда ссылается поле базового класса CData. Но это не правильно, поскольку значение поля часто меняется (объект пересоздается) и остлеживать вручную все ссылки...
Получается, мне надо работать именно с экземпляром базового класса, т.е.
constructor TCDataWrapper.Create(GeneralData: TCData)
а к методам будем обращаться так:
function TCDataWrapper.F1(): longint;
begin
F1:=GeneralData.F1(FormID);
end;
Правильно?
← →
unreger (2003-08-26 11:35) [41].
← →
Skier (2003-08-26 11:42) [42]
> поле, в котором хранится соединение должно быть одно для
> всего проекта, а все функции класса используют его.
В базовом классе делаешь свойство в котором хранишь соединение, а все
наследники его только используют (можешь сделать его read-only) и в своих
конструкторах не трогают, т.к. оно создаётся только в базовом классе.
Если я всё правильно уловил, то - так...
← →
unreger (2003-08-26 11:50) [43]>т.к. оно создаётся только в базовом классе.
вот тут я недопонимаю
ссылка на объект "соединение" (TADOConnection) хранится в поле экземпляра класса CData
если я наследую ТCDataWrapper от ТCData, то копируются все поля и методы, т.е. в ТCDataWrapper появляется указатель на объект типа TADOConnection,
но при создании экземпляра CDataWrapper этот указатель еще никуда не указывает. Надо или вызвать конструктор предка или передать ссылку на уже существующий экземпляр CData.
А этого делать не хочется т.к. TADOConnection часто пересоздается.
← →
Skier (2003-08-26 11:56) [44]Угу. Понял.
Но тогда твой вариант вполне подходит, IMHO.
Только :
TCData.Create; virtual; - конструктор базового класса;
TCDataWrapper.Create(GeneralData: TCData); reintroduce - конструктор класса - потомка;
Не подойдёт ?
← →
unreger (2003-08-26 12:00) [45]reintroduce
Ой, какие слова ты знаешь... надо посмотреть что такое
← →
unreger (2003-08-26 12:29) [46]ага, посмотрел, учту на будущее, но:
Класс-потомок, пожалуй, вообще не подойдет как идея.
Потому что должны выполняться только методы конкретного экземпляра класса TCData, а эти методы работают с внутренними приватными полями и никто больше не должен их видеть.
TCDataWrapper ничего не добавляет к функциональности, его едиственное назначение - избавить меня от необходимости вручную передавать идентификатор формы в методы TCData.
← →
Skier (2003-08-26 12:30) [47]
> Класс-потомок, пожалуй, вообще не подойдет как идея.
Ну тогда не создавай его. Что ещё проще...
← →
unreger (2003-08-26 13:31) [48]да, но это еще надо было понять.
Никто не хочет прокомментировать идею переноса обработчиков ошибок из форм в CData. Т.е. из какой бы формы не вызывались методы CData, я всегда могу вывести MessageBox с родителем-формой, в которой произошла ошибка, но главное, можно будет дописывать уникальные (специфические) способы исправления ошибок для конкретной формы, или пользоваться общим, универсальным.
Хотя вот тут http://delphimaster.net/view/1-1061811424/ немного задумался, похоже не получится проверять наличие метода у формы
← →
Skier (2003-08-26 13:34) [49]
> да, но это еще надо было понять.
В этом-то всё и дело - ты видимо ещё сам не разобрался до конца что
же тебе надо...
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2003.09.08;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.009 c