以单独的形式使用面向对象的子类

Using Object Orientated subclasses in a separate form

我创建了一个工厂单元,其中包含用于不同功能的多个子类。

工厂单位

//parent 
type
 TfactoryU = class(Tobject)
 public
 constructor create;
 end;

 //subclass 1
 TFormPosition = class (TfactoryU)
 private
 fFormName:tform;
 public
 constructor create (formName:tform);
 procedure centerForm(frm:tform);
 end;

implementation

{ TfactoryU }

constructor TFormPosition.Create(formName:tform);
 begin
   Inherited Create;
   fFormName:=formname;
 end;

procedure TFormPosition.centerForm(frm:tform);
begin
  frm.Left := (Screen.Width - frm.Width) div 2;
  
frm.Top := (Screen.Height - frm.Height) div 2;

end;

constructor TfactoryU.create;

begin

end;

但是,我不知道如何从不同的单元调用子类过程。

主机

procedure TfrmMERCH.FormActivate(Sender: TObject);

var

objfactoryU:TfactoryU;

begin

objfactoryU:=tformposition.create(frmmerch);

objfactoryU.centerForm(frmmerch);        

过程centerForm的调用用红色下划线表示。

centerForm() 不是 TfactoryU 的成员,这就是为什么在尝试通过 TfactoryU 变量调用它时会出现错误。您需要使用 type-cast 才能到达它,例如:

procedure TfrmMERCH.FormActivate(Sender: TObject);
var
  objfactoryU: TfactoryU;
begin
  objfactoryU := tformposition.create(frmmerch);
  tformposition(objfactoryU).centerForm(frmmerch);

但是,由于 objfactoryU 的声明和对 centerForm() 方法的调用都在同一个过程中,您应该只更改声明:

procedure TfrmMERCH.FormActivate(Sender: TObject);
var
  objfactoryU: tformposition;
begin
  objfactoryU := tformposition.create(frmmerch);
  objfactoryU.centerForm(frmmerch);