Форум: "Прочее";
Текущий архив: 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