【发布时间】:2015-12-08 13:29:30
【问题描述】:
我正在做一个项目,在该项目中我构建了一个由基本类“TFuncao”、两个后代类“TSolicitacao”、“TResposta”和尽可能多的后代类组成的结构,它们都是类的——仅具有属性的模型。
第一个是这个问题的重点,它有一个方法“ParaTexto”,它以特定的方式返回其所有属性的字符串(基本上将它们转换为字符串)。 那个“TSolicitacao”类有很多后代,每个都有“ParaTexto”方法调用它的祖先函数并添加它自己的属性。
所以,我的问题是:
我应该保留这种方法“ParaTexto”吗?或者删除它并使用接收“TSolicitacao”的方法创建一个类,并根据其类型(后代类)返回一个字符串?
我之所以这么想是因为从技术上讲,模型类应该只有 getter 和 setter。
代码 - 为节省空间而移除的 getter 和 setter:
“TFuncao”类文件:
unit Funcao;
interface
uses
Funcao.Tipo;
type
TFuncao = class abstract
private
FFUNCAO: TFuncaoTipo;
FSEQUENC: string;
procedure SetFUNCAO(const Value: TFuncaoTipo);
procedure SetSEQUENC(const Value: string);
published
property SEQUENC: string read FSEQUENC write SetSEQUENC;
property FUNCAO: TFuncaoTipo read FFUNCAO write SetFUNCAO;
constructor Create; virtual;
end;
“TSolicitacao”类文件:
unit Funcao.Solicitacao;
interface
uses
Funcao;
type
TSolicitacao = class abstract (TFuncao)
published
function ParaTexto: string; virtual;
end;
implementation
uses
Funcoes,
SysUtils;
{ TSolicitacao }
function TSolicitacao.ParaTexto: string;
begin
Result :=
Copy(CompletarComEspacoAEsquerda(SEQUENC, 4), 1, 4) +
Completar0AEsquerda(IntToStr(Integer(FUNCAO)), 2);
end;
end.
“TVendaSolicitacao”类文件——“TSolicitacao”的后代类示例:
unit Venda.Solicitacao;
interface
uses
Funcao.Solicitacao,
Funcao.Tipo,
Venda.Solicitacao.Produto;
type
TVendaSolicitacao = class (TSolicitacao)
private
FNUMFISCAL: Integer;
FNUMPDV: Integer;
FAUTORIZ: string;
FCONV_TIPO: Integer;
FProdutos: TVendaSolicitacaoProdutoList;
procedure SetAUTORIZ(const Value: string);
procedure SetCONV_TIPO(const Value: Integer);
procedure SetNUMFISCAL(const Value: Integer);
procedure SetNUMPDV(const Value: Integer);
procedure SetProdutos(const Value: TVendaSolicitacaoProdutoList);
published
property NUMPDV: Integer read FNUMPDV write SetNUMPDV;
property NUMFISCAL: Integer read FNUMFISCAL write SetNUMFISCAL;
property AUTORIZ: string read FAUTORIZ write SetAUTORIZ;
property CONV_TIPO: Integer read FCONV_TIPO write SetCONV_TIPO;
property Produtos: TVendaSolicitacaoProdutoList read FProdutos write SetProdutos;
function ParaTexto: string; override;
constructor Create; override;
end;
implementation
uses
SysUtils,
Funcoes;
{ TVendaSolicitacao }
constructor TVendaSolicitacao.Create;
begin
inherited;
FUNCAO := ftVenda;
FProdutos := TVendaSolicitacaoProdutoList.Create;
end;
function TVendaSolicitacao.ParaTexto: string;
begin
Result :=
inherited +
Completar0AEsquerda(NUMPDV, 4) +
Completar0AEsquerda(NUMFISCAL, 6) +
Completar0AEsquerda(AUTORIZ, 12) +
IntToStr(CONV_TIPO);
if Produtos.Count > 0 then
Result := Result + #13#10 + Produtos.ParaTexto;
end;
end.
“TConversao”类文件——正如我所见:
unit Conversao;
interface
uses
Funcao;
type
TConversao = class
published
function ParaTexto(Funcao: TFuncao): string;
end;
implementation
uses
Solicitacao,
Solicitacao.Venda,
Funcoes;
function ParaTexto(Funcao: TFuncao): string;
begin
Result := '';
if (Funcao is TSolicitacao) then
Result :=
Copy(CompletarComEspacoAEsquerda((Funcao as TSolicitacao).SEQUENC, 4), 1, 4) +
Completar0AEsquerda(IntToStr(Integer((Funcao as TSolicitacao).FUNCAO)), 2);
if (Funcao is TVendaSolicitacao) then
begin
Result :=
inherited +
Completar0AEsquerda((Funcao as TVendaSolicitacao).NUMPDV, 4) +
Completar0AEsquerda((Funcao as TVendaSolicitacao).NUMFISCAL, 6) +
Completar0AEsquerda((Funcao as TVendaSolicitacao).AUTORIZ, 12) +
IntToStr((Funcao as TVendaSolicitacao).CONV_TIPO);
if Produtos.Count > 0 then
Result := Result + #13#10 + Produtos.ParaTexto;
end;
【问题讨论】:
-
如果我理解正确的话,你所说的“孩子”通常被称为后代,而你所说的父母是“祖先”。请指正,这是两个不同的概念,很混乱。
-
@whosrdaddy 我把代码作为例子和我所问的具体应用。
-
@whosrdaddy 现在我明白了,谢谢你的提示
-
@YuriyAfanasenkov 感谢您提供的信息。已进行更改。
-
我已经更新了我的答案,添加了如何在您的情况下使用 RTTI 的示例。希望对您有所帮助。
标签: class delphi model delphi-2009