Delphi 中如何在编译时有条件地改变类继承??

vql8enpb  于 2023-08-04  发布在  其他
关注(0)|答案(2)|浏览(88)

我正在做一个 Delphi 项目,在这个项目中我定义了一组特定的类,比如:

TClassA = class(TObject)
...
TClassB = class(TObject)
...
TMyClass = class(TClassA)
...

字符串
我有一个需求,即基于编译时确定的某些条件,我希望TMyClass继承TClassB。
从本质上讲,我希望能够写这样的东西:

{$IFDEF SOME_COMPILE_TIME_CONDITION}
TMyClass = class(TClassB)
{$ELSE}
TMyClass = class(TClassA)
{$ENDIF}


在 Delphi 中是否可以在编译时有条件地定义TMyClass的父类?如果是这样,我如何才能做到这一点?如果没有,你有什么可以建议的替代方法或替代方法吗?

bjp0bcyl

bjp0bcyl1#

我不确定这是否符合 * 更优雅 * 的资格,但无论如何,你可能很难找到其他的东西:

{$IFDEF SOME_COMPILE_TIME_CONDITION}
TMyParentClass = TClassB
{$ELSE}
TMyParentClass = TClassA
{$ENDIF}

TMyClass = class(TMyParentClass)

字符串

kr98yfug

kr98yfug2#

这可能有点偏离,这取决于你想做什么,但根据我所掌握的信息,我会使用一个接口来解决这个问题。
伪代码

type
  TMyClass = class( TMyBaseClass ); 
    
  TMyBaseClass = class
  private
    fImplementation: IMyImplementation;
  public
    constructor Create;
  end;
    
constructor TMyBaseClass.Create;
begin
  {$ifdef CONDA}
  fImplementation := TCondAImplementation.Create;
  {$else}
  fImplementation := TCondBImplementation.Create;
  {$end}
end;

字符串
然后,您的后代可以调用基类的受保护方法,这些方法调用不同的实现,或者直接提供对fImplementation成员的受保护访问。

相关问题