Как избежать дублирования кода в Delphi - PullRequest
2 голосов
/ 27 мая 2011

У меня есть два компонента A и B. Компонент B является производным от компонента A и разделяет с ним большинство свойств и процедур. Теперь у меня длинная процедура, подобная этой:

procedure DoSomething;
begin
  Form1.Caption := Component_A.Caption;
  // hundreds of additional lines of code calling component A
end;

В зависимости от того, активен компонент B или нет, я хотел бы повторно использовать вышеуказанную процедуру и заменить часть Component_A именем компонента B. Тогда это должно выглядеть следующим образом:

procedure DoSomething;
var
  C: TheComponentThatIsActive;
begin
  if Component_A.Active then
    C := Component_A;
  if Component_B.Active then
    C := Component_B;
  Form1.Caption := C.Caption;
end;

Как я могу это сделать в Delphi2007?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 27 мая 2011

TheComponentThatIsActive должен быть того же типа, что и ComponentA (TComponentA).

Теперь, если вы наткнетесь на камень преткновения, где некоторые свойства / методы относятся только к ComponentB, проверьте и введите его.

procedure DoSomething;
var
    C: TComponentA;

begin
    if Component_A.Active then
        C := Component_A
    else if Component_B.Active then
        C := Component_B
    else
        raise EShouldNotReachHere.Create();

    Form1.Caption := C.Caption;

    if C=Component_B then
        Component_B.B_Only_Method;
end;
2 голосов
/ 27 мая 2011

Вы можете передать ComponentA или ComponentB в DoSomething в качестве параметра.

ComponentA = class
public 
 procedure Fuu();
 procedure Aqq();
end;

ComponentB = class(ComponentA)
public 
 procedure Blee();
end;

implementation

procedure DoSomething(context:ComponentA);
begin
  context.Fuu();
  context.Aqq();
end;

procedure TForm1.Button1Click(Sender: TObject);
var cA:ComponentA;
    cB:ComponentB;
begin
  cA:= ComponentA.Create();
  cB:= ComponentB.Create();

  DoSomething(cA);
  DoSomething(cB);

  cA.Free;
  cB.Free;
end;
...