请教:是有关功能类似但对于不同数据类型算法不一样时简化结构的问题(100分)

  • 主题发起人 主题发起人 delphikj
  • 开始时间 开始时间
D

delphikj

Unregistered / Unconfirmed
GUEST, unregistred user!
请教大家一个问题;
自己定义如下两个数据类型,
R_matrix=Record
R_matrix_num:arraycomplex;
row_num:integer;
line_num:integer;
end;

R_matrix_real=Record
R_matrix_num_real:arrayreal;
row_num_real:integer;
line_num_real:integer;
(其中arraycomplex与 arrayreal是自定义的不同数据类型的二维数组)
功能上很类似,主要区别是一个是复数,另一个是实数类型。
我分别定义了
constructor Tmatrix.initmatrix(matrixinit:R_matrix);
constructor Tmatrix.initmatrix_real(matrixinit:R_matrix_real);
两个构造函数根据数据类型的不同来生成不同的对象。
因为里面的方法功能基本一样,不同是对应不同数据类型,算法有所不同。
例如我有一个函数是两个数相乘,
对复数我定义了function matrix_multify(F_matrix_num,S_matrix_num:Tmatrix):R_matrix;
对实数我定义了function matrix_multify_real(F_matrix_num,S_matrix_num:Tmatrix):R_matrix_real;
来求解。已经可以用了,但是感觉不是很合理。
我希望能将两个constructor能合并起来,不知大家遇到这样情况如何处理的。
 
Delphi是没有运算符重载的 不过利用函数重载已经可以好多了
但是实际上针对与每种类型的每个操作 都要写代码的
C++里边的泛型什么的我不是很懂 但是Delphi里边没有的
 
我想实现象如下的设计,但抽象虚拟函数complexmultify的数据类型在后面具体实现的时候
是要变的,下面的结构就有问题了,大家是怎样处理这个问题的,希望得到您的帮助。
type
R_complex_number=record
x:extended;
y:extended;
end;
Tcomx=class(Tobject)
public
function complexmultify(f_com_num,s_com_num:R_complex_number):R_complex_number;virtual;
abstract;
end;
Tcomplex=class(Tcomx)
public
function complexmultify(f_com_num,s_com_num:R_complex_number):R_complex_number;override;
end;
Tcomplex2=class(Tcomx)
public
function complexmultify(f_com_num,s_com_num:double):double;override;
end;
 
使用overload,或者使用变体记录,参考一下Message的记录类型
 
谢谢影子朋友的提示,查了以下Tmessage的结构
PMessage = ^TMessage;
TMessage = packed record
Msg: Cardinal;
case Integer of
0: (
WParam: Longint;
LParam: Longint;
Result: Longint);
1: (
WParamLo: Word;
WParamHi: Word;
LParamLo: Word;
LParamHi: Word;
ResultLo: Word;
ResultHi: Word);
end;
但我没有看懂这里integer起了什么作用,具体到程序里面,怎样控制执行哪一个操作呢?
可以讲的详细一点吗?
 
我定义了如下数据类型,但通不过,
提示:“Type 'arrayreal' needs finalization - not allowed in variant record”
Type 'arraycomplex' needs finalization - not allowed in variant record"
还有别的办法吗?:(
R_complex_number=record
x:extended;
y:extended;
end;
arraycomplex=array of array of R_complex_number;
arrayreal=array of array of extended;
R_matrix=Record
row_num:integer;
line_num:integer;
case integer of
0:R_matrix_num:arraycomplex;
1:R_matrix_num_real:arrayreal;
end;
 
不能给一个定长的数组吗?
 
不行的,数组大小需要动态确定的。
 
后退
顶部