Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.214 c
2-1161596663
Ося
2006-10-23 13:44
2006.11.05
Динамически созданные СheckBox


2-1161615466
abba
2006-10-23 18:57
2006.11.05
Посчитать число слов в строке?


15-1160952282
AntiUser
2006-10-16 02:44
2006.11.05
Помогите правильно перевести на английский


2-1161086229
vain
2006-10-17 15:57
2006.11.05
Отладка функций в dll


2-1161336939
Gloomer
2006-10-20 13:35
2006.11.05
Посоветуйте простую компоненту для ввода вещественных чисел





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