gpt4 book ai didi

Delphi 双记录助手

转载 作者:行者123 更新时间:2023-12-03 15:23:14 25 4
gpt4 key购买 nike

情况

我编写了一个二阶方程类,如下所示。您可以找到here该类的完整代码,但与问题不太相关。

type
TArrayOfDouble = array of array of double;

type
TEqSecGrado = class
private
//variables
a, b, c: double;
delta: double;
solutions: TArrayOfDouble;
solRealCount: integer;
solImaginaryCount: integer;
class var currentIstances: integer;
class var totalIstances: integer;
//methods
function getDelta(const vala, valb, valc: double): double; overload;
public
constructor Create(const a, b, c: double);
destructor Destroy; override;
//methods
function getDelta: double; overload;
function getSolutions: TArrayOfDouble; virtual;
//properties
property valueOfA: double read a;
property valueOfB: double read b;
property valueOfC: double read c;
property realSolutionsCount: integer read solRealCount;
property imaginarySolutionsCount: integer read solImaginaryCount;
class property currentEquationsCount: integer read currentIstances;
class property totalEquationsCount: integer read totalIstances;
end;

我想创建一个名为 TArrayOfDouble 的新类型,它将包含我的方程的解。在主窗体中,我以这种方式使用该类:

procedure TForm3.Button1Click(Sender: TObject);
var solver: TEqSecGrado;
soluzioni: TArrayOfDouble;
begin

//f(x) = 3x^2 - x - 2 -> [sol.1 = 1 | sol.2 = -0,666666666666667]
solver := TEqSecGrado.Create(3,-1,-2);

try
soluzioni := solver.getSolutions;
//soluzioni[0][0] = 1; soluzioni[0][1] = 0;
//soluzioni[1][0] = -0,666666666666667; soluzioni[1][1] = 0;
finally
solver.Free;
end;

end;

现在我在 soluzioni 中得到了结果,并且可以输出它们。 (我使用了矩阵,因为在第一个位置我放置了实数解,在本例中为 1 和 -0.67,如果需要,在第二个运动中放置假想解)。

<小时/>

问题

当我输出解时,我想将它们转换成分数。我想做一些类似 soluzioni[a][b].toFraction 的事情。所以我想我可以使用一个记录助手来实现 double 。

type
TSupport = record helper for Double
function toFraction: string;
function toString: string; //I have added this LATER
end;

我带着我的疑问来了。创建 TSupporttoFraction 方法后,我可以调用 soluzioni[0][0].toFraction 但无法调用 soluzioni[i][ 0].toString。

为了解决我的问题,我决定添加函数 toString 并且一切正常。记录助手是否隐藏了所有其他方法?如果我删除了记录助手,我可以像往常一样再次使用 toString 方法。

我知道助手是一种在不使用继承的情况下扩展类的方法,但为什么我只能使用在助手中声明的方法?

最佳答案

类和记录助手的一个限制是一次只能有一个处于事件状态。 DoubleToString 方法实际上是在 Delphi RTL 提供的记录助手中实现的。一旦将助手附加到类型上,RTL 助手就不再处于事件状态。

documentation说:

You can define and associate multiple helpers with a single type. However, only zero or one helper applies in any specific location in source code. The helper defined in the nearest scope will apply. Class or record helper scope is determined in the normal Delphi fashion (for example, right to left in the unit's uses clause).

自从引入助手以来,Embarcadero 就知道这是一个长期存在的问题。多年来,他们没有解决这个问题,并且以世界上最好的意愿,我认为你应该假设他们永远不会解决。

所以,你有两个选择:

  1. 附加您自己的帮助程序,并接受您无法使用 RTL 帮助程序的功能。
  2. 通过助手以外的方式实现您的功能。

关于Delphi 双记录助手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39436376/

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