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

Вниз

Как сделать паттерн State не к перечеслению, а к множеству?   Найти похожие ветки 

 
Ш-К   (2007-09-05 18:46) [0]

Вот.


 
celades ©   (2007-09-05 18:59) [1]

Ты сам понимаешь чего хочешь?


 
Ш-К   (2007-09-05 19:11) [2]

Да. Я хочу расширять поведение модели путем добаления класса, соответствующего элементу множества.
Для перечисления - без проблем. Что делаете для множеста?
Если ничего не делаете, а в каждом методе рисуете 10-этажные if-ы и case-ы, отпишите сюда. Буду знать.


 
Ш-К   (2007-09-05 19:16) [3]

Вопрос теоритический.


 
oxffff ©   (2007-09-05 19:49) [4]


> Ш-К   (05.09.07 19:16) [3]
> Вопрос теоритический.


В твоем случае
Если состояние - множество. То объект находится одновременно в нескольких состояниях. То есть должны вызываться методы состояний для состояний в которых находится объект.

Честно говоря, идея паттерна - делегирование реализации + Run time его смена.
Что мешает, модифицировать Паттерн для нужной реализации?


 
Ш-К   (2007-09-05 19:57) [5]

Но если у меня множесто из 8 элементов, сколько клвссов состояний, мне прийдется реализовать? Это при том, что ВСЕ они мне не будут нужны.
Тут нужен более красивый подход. Типа: добавил элемент в множество - добавил класс и все работает. :)


 
oxffff ©   (2007-09-05 20:10) [6]

Можно сделать неограниченное множество.

TStateClass=TClass;

TState=class
protected
ActiveStates:TList;
function GetState(idx:TStateClass):boolean;
procedure SetState(idx:TStateClass;value:boolean);
public
constructor create;
destructor destroy;override;
property State[idx:TStateClass]:boolean read GetState write SetState;
end;

{ TState }

constructor TState.create;
begin
ActiveStates:=TList.Create;
end;

destructor TState.destroy;
begin
ActiveStates.free;
end;

function TState.GetState(idx: TStateClass): boolean;
begin
if ActiveStates.IndexOf(idx)>-1 then result:=true else result:=false;
end;

procedure TState.SetState(idx: TStateClass; value: boolean);
begin
if value and (ActiveStates.IndexOf(idx)<0) then ActiveStates.add(idx)
       else ActiveStates.Remove(idx);
end;

procedure TForm1.Button1Click(Sender: TObject);
var a:TState;
begin
a:=TState.create;

a.State[Tobject]:=false;
a.State[Tobject]:=true;
a.State[TButton]:=true;
a.State[TButton]:=false;

a.free;
end;



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

Форум: "Прочее";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.147 c
15-1188484927
lookin
2007-08-30 18:42
2007.09.30
Про пиво и клаву...


15-1188910325
TUser
2007-09-04 16:52
2007.09.30
С днем рождения, 4 сентября


2-1188549329
@!!ex
2007-08-31 12:35
2007.09.30
Почтовый клиент.


15-1188495169
Kolan
2007-08-30 21:32
2007.09.30
Что за кодировка: &amp;laquo;РЁСЂСЌРє Третий&amp;raquo; ?


2-1188628759
Putnik
2007-09-01 10:39
2007.09.30
Проблемы с сообщениями Windows





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