Главная страница
    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.47 MB
Время: 0.048 c
8-1144233342
dmitrlast
2006-04-05 14:35
2006.11.05
Файл ресурса и mid/wav файл


2-1161155855
Alex_C
2006-10-18 11:17
2006.11.05
Как правильно написать свой компонент?


15-1160944112
Petr V.Abramov
2006-10-16 00:28
2006.11.05
Съедобны ли сведезамороженные грибы?


2-1161460722
funky
2006-10-21 23:58
2006.11.05
удалить опред. строчку из файла


2-1161366808
имя
2006-10-20 21:53
2006.11.05
My Proxy 7.56





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский