gpt4 book ai didi

delphi - 是否可以在 delphi 类上定义虚拟静态成员?

转载 作者:行者123 更新时间:2023-12-03 18:37:13 25 4
gpt4 key购买 nike

我需要创建类似的东西,我用 PHP 语言实现了它。

假设我创建了一个定义了 2 个静态成员变量的基类,然后子类应该能够“覆盖”它们,所以如果我在 BaseClass 中定义了静态变量“someStatic”,然后我子类化到 DerivedClass ,当我调用 TDerivedOne.someStatic 时,程序应该显示派生类中的 someStatic。但是 Delphi 不是这种情况,我肯定是错误地实现了它。

目前,我实现了另一种设计方法,其中变量未声明为静态的,然后创建了一个名为“setup”的虚拟抽象方法,然后将在 BaseClass 构造函数上调用此设置,但此设计需要在我们检索所需变量之前首先创建的对象。

现在出于好奇,我想知道是否可以实现虚拟静态变量来节省“几次输入……”

这是问题的代码片段

program Project1;

{$APPTYPE CONSOLE}


uses
SysUtils;


type
TBaseClass = class
protected
class var someStatic: string;

public
class function get: string; virtual;
end;

TDerived = class( TBaseClass )
(*
//if i uncomment this section, then the print bellow will print the Base's static var
protected
class var someStatic: string;
*)
end;

TDerived2 = class( TBaseClass )
end;

class function TBaseClass.get: string;
begin
Result := someStatic;
end;


begin
// ------If the class is defined per unit, this one should be on the initialization section
TBaseClass.someStatic := 'base';
TDerived.someStatic := 'derived';
TDerived2.someStatic := 'derived2';
// ------END OF INITIALIZATION

try
//i'm expecting this would print 'derived' but it prints 'derived2' :'(
//i am using DelphiXE
//apparently delphi treat the statics differently from that of php's
writeln( TDerived.get );
readln;
except
on E: Exception do
writeln( E.ClassName, ': ', E.Message );
end;

end.

干杯:)

最佳答案

没问题,只要您也重写 Get 方法即可:

program Project1;

{$APPTYPE CONSOLE}

type
TBase = class
protected
class var FSomething: String;
class function Get: String; virtual;
end;

TDerived1 = class(TBase)
protected
class var FSomething: String;
class function Get: String; override;
end;

TDerived2 = class(TBase);

class function TBase.Get: String;
begin
Result := FSomething;
end;

class function TDerived1.Get: String;
begin
Result := FSomething;
end;

begin
TBase.FSomething := 'Base';
TDerived1.FSomething := 'Derived1';
TDerived2.FSomething := 'Derived2';
WriteLn(TDerived1.Get);
ReadLn;
end.

为了可读性,我建议重命名 TDerived1 中的私有(private)字段。

或者,使用类属性:

program Project1;

{$APPTYPE CONSOLE}

type
TBase = class
private
class var FSomething: String;
public
class property Something: String read FSomething write FSomething;
end;

TDerived1 = class(TBase)
private
class var FAnotherThing: String;
public
class property Something: String read FAnotherThing write FAnotherThing;
end;

TDerived2 = class(TBase);

begin
TBase.Something := 'Base';
TDerived1.Something := 'Derived1';
TDerived2.Something := 'Derived2';
WriteLn(TDerived1.Something);
ReadLn;
end.

关于delphi - 是否可以在 delphi 类上定义虚拟静态成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17896610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com