Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
aaleksander
111 / 85 / 21
Регистрация: 06.06.2011
Сообщений: 397
Записей в блоге: 1
#1

Посредник и overload - Delphi

07.03.2012, 11:36. Просмотров 994. Ответов 4
Метки нет (Все метки)

Добрый день.
Пытаюсь реализовать паттерны медиатор, команда и актер и столкнулся с такой странностью.
У актера есть два перегруженных метода (для двух типов команд). Если я явно вызываю у актера ExecuteCommand с параметром TCommand2, то вызывается нужный метод. Если передаю команду через медиатор, то всегда - TCommand.
Вот код (на ошибки не смотреть - это выжимка).
Т.е. если я вызываю непосредственно актера act.ExecuteCommand(TCommand2.Create), то он мне сообщает "command2". А если вызываю mediator.ExecuteCommand(TCommand2.Create), то актер,не смотря на то, что получается TCommand2, вызывает метод предназначенный для TCommand.
Подскажите как от этого избавиться и добиться правильной работы кода?

Спасибо.

P.S. Данный подход решил применить, чтобы избавить от портянки однотипных условий if command is ... then.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
  TForm1 = class(TForm)
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
  TCommand = class
  public
  end;
 
  TCommand2 = class (TCommand)
  public
  end;
 
  TActor = class
  public
    procedure Execute(aCom: TCommand);overload;
    procedure Execute(aCom: TCommand2);overload;
  end;
 
  TMediator = class
  protected
    act: TActor;
  public
    procedure execute(aCom: TCommand);
  end;
 
 
procedure TActor.Execute(aCom: TCommand);
begin
  ShowMessage('command');
end;
 
procedure TActor.Execute(aCom: TCommand2);
begin
  ShowMessage('command2');
end;
 
procedure TForm1.btn1Click(Sender: TObject);
var
  med: TMediator;
  act: TActor;
begin
  med := TMediator.Create;
  med.Execute(TCommand2.Create);
//  act := TActor.Create;
//  act.Execute(TCommand2.Create);
end;
 
{ TMediator }
 
procedure TMediator.execute(aCom: TCommand);
var
  str: string;
begin
  str := aCom.ClassName;
  act := TActor.Create;
  act.Execute( aCom );
//  act.Execute( aCom as TCommand2);
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.03.2012, 11:36
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Посредник и overload (Delphi):

Создать класс и написать overload конструктор
Нужно создать класс, арендовать TImage и TMemo. Написать overload конструктор....

Overload + jmp/call
Есть несколько overload-функций. Нужно выполнить прыжок инструкцией jmp (ну или...

Перевод с С++. Виртуальный overload метод, экспортируемый из DLL
Здравствуйте! Имеется DLL, написанная на С++ DLL экспортирует класс в котором...

Посредник для вспомогательной библиотеки
Всем привет. У меня есть много приложений под AutoCAD и Revit. В этих...

Шаблон Посредник, привести пример
кому не сложно, приведите пожалуйста небольшой пример шаблона -посредник

Word, Access и, видимо, посредник-VB...
А фича такая. Текст из ворда нужно перенести в базу на аксесе. Путь через буфер...

4
Alex_pac
1291 / 697 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
07.03.2012, 17:10 #2
P.S. Данный подход решил применить, чтобы избавить от портянки однотипных условий if command is ... then.
если опять вызывать через медиатор условия все равно будут ИМХО.

Чтобы без условий надо напрямую делать вызов через Объект actor.


Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
  TCommand = class(TObject)
  public
  end;
 
  TCommand2 = class (TCommand)
  public
  end;
 
  TActor = class(TObject)
  public
    procedure Execute(aCom: TCommand); overload;
    procedure Execute(aCom: TCommand2); overload;
  end;
 
  TMediator = class(TObject)
  private
    act: TActor;
  public
    constructor Create;
    destructor Destroy; override;
    procedure execute(aCom: pointer);
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TActor.Execute(aCom: TCommand);
begin
  ShowMessage('command');
end;
 
procedure TActor.Execute(aCom: TCommand2);
begin
  ShowMessage('command2');
end;
 
{ TMediator }
 
constructor TMediator.Create;
begin
  act:= TActor.Create;
end;
 
destructor TMediator.Destroy;
begin
  act.Destroy;
  inherited;
end;
 
procedure TMediator.execute(aCom: pointer);
begin
  if TObject(aCom) is TCommand2 then
    act.Execute(TCommand2(aCom))
  else
    act.Execute(TCommand(aCom));
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  med: TMediator;
  act: TActor;
  c2: TCommand2;
  c: TCommand;
begin
  med := TMediator.Create;
  c2:=TCommand2.Create;
  c:=TCommand.Create;
  med.Execute(c2);
  med.Execute(c);
  c2.Destroy;    // очистка памяти
  c.Destroy;    // очистка памяти
  med.Destroy;  // очистка памяти
 
//  act := TActor.Create;
//  act.Execute(TCommand2.Create);
 
end;
 
end.
0
Вложения
Тип файла: zip blalba.zip (232.0 Кб, 2 просмотров)
aaleksander
111 / 85 / 21
Регистрация: 06.06.2011
Сообщений: 397
Записей в блоге: 1
07.03.2012, 18:56  [ТС] #3
Медиатор, как более универсальный класс, может передать без условий.
Но тогда в самом актере появится конструкция

Delphi
1
2
3
4
if com is TCommand then
 ...
if com is TCommand2 then
  ...
Просто непонятно, почему в актере оператор "is" работает нормально, а сам компилятор нужный перегруженный метод вызвать не может.
0
Alex_pac
1291 / 697 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
07.03.2012, 20:25 #4
а сам компилятор нужный перегруженный метод вызвать не может
класс медиатор не может сам вызвать перегруженный метод без условий, по причине неопределенности входящего указателя.

перегруженный метод можно вызвать напрямую, тогда не потребуется ставить условия

med.act.execute(com);
0
aaleksander
111 / 85 / 21
Регистрация: 06.06.2011
Сообщений: 397
Записей в блоге: 1
07.03.2012, 20:45  [ТС] #5
Тогда теряется смысл медиатора. Ладно, будем считать это особенностью делфи и выкручиться по другому.
0
07.03.2012, 20:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.03.2012, 20:45
Привет! Вот еще темы с решениями:

Посредник между клиентом и сервером
Передо мной встала задача реализации программы посредника между клиентом и...

Microlab h600 устройство посредник
Вот так выглядит моя проблема. Мне некуда вставить эти 6 выходов. Прошу...

Модуль-посредник для wtsapi32.dll
Здравствуйте. Вот пытаюсь написать модель-посредник для wtsapi32.dll. Судь...

overload функции
єсть клас оверлоадових опрераторов, но никак не виходит вивести то что они...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru