Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.05;
Скачать: CL | DM;

Вниз

Объект с разной ртруктурой..   Найти похожие ветки 

 
Kolan ©   (2006-10-16 11:52) [0]

Здравствуйте,
 Все одно на другое :)

И так мне нужен объект, который получив массив юайт расидает его по полям.
Вроде ничего сложного:
Пример: Пусть будет 2 поля.
TCustomClass =
private
 FA: Integer;
 FB: Byte;
public
 Assign(Arr: array of Byte); virtual;
 property A...
 property B
end;


В методе Assign и произойдет разделение данных по полям. те как то так:
FA := Arr[0];
FB := Arr[1];


Переопределив Assign в потомках я смогу изменить способ выделения данных.

Все хорошо, только нужно чтобы еще и кол-во и состав полей был разный.
Но тогда мне нужно в каждом потомке добавлять свойства, те изменять интерфйс.

А если я изменю интерфйис, то как я узнаю об этом?
Допустим есть потомок:
TDescendantClass =
private
 FA: Integer;
 FB: Byte;
 FC: Double;
public
 Assign(Arr: array of Byte); override;
 property A...
 property B
 property C...
end;



И функция в которую я передам экземпляр TDescendantClass.
procedure DoSmth(Obj: TCustomClass);
begin

end;

Как она поймет что у Obj есть св-во С?


 
Рамиль ©   (2006-10-16 12:04) [1]

if Obj is TDescendantClass then TDescendantClass(Obj).C := ...


 
Kolan ©   (2006-10-16 12:12) [2]


> if Obj is TDescendantClass then TDescendantClass(Obj).C
> := ...

Че-то я туплю... Думал что процедура обработки не будет знать о типе Obj. Поэтому и просил. Те думал такой вариант не подойдет.

А обрабатывать то все равно по разному в зависимости от того какого типа объект. Те првильно...


 
Sandman29 ©   (2006-10-16 12:23) [3]

А обрабатывать то все равно по разному в зависимости от того какого типа объект. Те првильно...

Возможно, стоит сделать DoSomth виртуальным методом, тогда каждый класс сам будет себя обрабатывать.


 
Kolan ©   (2006-10-16 12:27) [4]


> тогда каждый класс сам будет себя обрабатывать.

Нет. Этот класс сам себя не обрабатывает. Он передается в процедуры обработки других классов.

А вообще можно вытащить из Obj его тип? Что-то вроде:

(Obj as Obj.Type).


 
Sandman29 ©   (2006-10-16 12:32) [5]

Kolan ©   (16.10.06 12:27) [4]

Хорошо. Тогда можно добавить промежуточный класс-обработчик.

TCustomClassProcessor = class
...
public
procedure DoSomething(WhatToProcess: TCustomClass); virtual;
end;

TDescendantClassProcessor = class (TCustomClassProcessor)
...
end;

procedure TDescendantClassProcessor.DoSomething;
begin
 inherited;
 ...
end;


 
Sandman29 ©   (2006-10-16 12:33) [6]

Kolan ©   (16.10.06 12:27) [4]

Ага. И устроить case? А потом добавится еще один потомок и придется изменять все case?
Теоретически считается, что наличие case говорит об ошибке проектирования


 
Kolan ©   (2006-10-16 12:35) [7]


> Хорошо. Тогда можно добавить промежуточный класс-обработчик.

Ну да так и сделаю. Всеравно обработка зависит от того какого класса объект.


> Ага. И устроить case? А потом добавится еще один потомок
> и придется изменять все case?
> Теоретически считается, что наличие case говорит об ошибке
> проектирования

Да, да - глупость, благодарю :)


 
Kolan ©   (2006-10-16 12:39) [8]

Вот только тк объект передается в разные места, работать с ним удобнее через интерфейс, чтобы не заботиться об удалении. И выходит не каждый потомок мне нужен свой интерфейс :(.
Или лучьше без интерфейсов сделать, а окуратно удалять самому, когда не нужен будет...


 
Sandman29 ©   (2006-10-16 12:57) [9]

Kolan ©   (16.10.06 12:39) [8]

Если объект постоянно фигурирует в параметрах разных методов разных объектов, можно попытаться передавать его один раз - в конструкторе фасадного класса.


 
Kolan ©   (2006-10-17 14:28) [10]


> Sandman29 ©   (16.10.06 12:57) [5]

Благодарю. Как то вш совет в порядок привел все - классно получилось.



Страницы: 1 вся ветка

Текущий архив: 2006.11.05;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.052 c
5-1142103023
AdmeraL
2006-03-11 21:50
2006.11.05
Значения Default


3-1157687718
Slym(RO)
2006-09-08 07:55
2006.11.05
Advantage и кривые blobы как пофиксить?


3-1156938889
Mishenka
2006-08-30 15:54
2006.11.05
Сортировка в запросе


15-1160668265
menart
2006-10-12 19:51
2006.11.05
Modbus


15-1161192678
YurikGL
2006-10-18 21:31
2006.11.05
Множественное подключение к одному принтеру Canon LBP3200