状况
我写了一个类似于二级方程的类。您可以找到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
之类的事情。所以我认为我可以使用记录助手来实现双倍。
type
TSupport = record helper for Double
function toFraction: string;
function toString: string; //I have added this LATER
end;
我怀疑地来到这里。一旦我创建了TSupport
和toFraction
方法,我就可以调用soluzioni [0] [0] .toFraction,但我无法调用soluzioni [i] [0] .toString。< / p>
为了解决我的问题,我决定添加函数toString,一切正常。记录助手是否隐藏了所有其他方法?如果我删除了记录助手,我可以像往常一样再次使用toString方法。
我知道帮助器是一种在不使用继承的情况下扩展类的方法,但为什么我只能使用我在帮助器中声明的方法?
答案 0 :(得分:7)
类和记录助手的限制是一次只能激活一个。 ToString
的{{1}}方法实际上是在Delphi RTL提供的记录助手中实现的。将助手附加到类型后,RTL助手不再处于活动状态。
您可以使用单一类型定义和关联多个帮助程序。但是,源代码中的任何特定位置只应用零或一个助手。最近范围中定义的帮助程序将适用。类或记录助手范围以正常的Delphi方式确定(例如,在单位的使用条款中从右到左)。
这是一个长期存在的问题,自从助手被引入以来,Embarcadero一直都知道这个问题。在很长一段时间里,他们没有解决这个问题,而且我认为你应该假设世界上最好的意志永远不会解决。
所以,你有两个选择: