Текущий архив: 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.47 MB
Время: 0.048 c