|
FOutput: TTextStream;
public
procedure VisitField(Instance: TField); override;
procedure VisitMethod(Instance: TMethod); override;
procedure VisitProperty(Instance: TProperty); override;
property Output: TTextStream read FOutput write FOutput;
end;
{ TCodeGenerationVisitor }
procedure TCodeGenerationVisitor.VisitField(Instance: TField);
begin
Output.WriteLnFmt('''' %s: %s;'''', [Instance.Name, Instance.DataName]);
end;
procedure TCodeGenerationVisitor.VisitMethod(Instance: TMethod);
var
MKStr, DTStr: string;
begin
case Instance.MethodKind of
mkConstructor: MKStr := ''''constructor'''';
mkDestructor: MKStr := ''''destructor'''';
mkProcedure: MKStr := ''''procedure'''';
mkFuntion: MKStr := ''''function'''';
end;
if Instance.MethodKind = mkFunction then
DTStr := '''': '''' + Instance.DataName
else
DTStr := '''''''';
{代码不完整,现足以演示Tmethod代码生成 }
Output.WriteLnFmt('''' %s %s%s%s;''''
[MKStr, Instance.Name, Instance.Parameters, DTStr]);
end;
procedure TCodeGenerationVisitor.VisitProperty(Instance: TProperty);
begin
Output.WriteLnFmt('''' property %s: %s read %s write %s;'''',
[Instance.Name, Instance.DataName,
Instance.ReadSpecifier, Instance.WriteSpecifier]);
end;
{ TCodeGenerator }
procedure TCodeGenerator.Generate(Members: TList; Output: TTextStream);
var
I: Integer;
begin
{写入类定义 }
Output.WriteLine(''''TSample = class (TObject)'''');
{好! 加入代码生成器的访问者}
Visitor := TCodeGenerationVisitor.Create;
Try
{记住为访问都提供上下文,以便更好的访问VisitXXX方法。}
for I := 0 to Members.Count - 1 do
{ 代码的具体段,好事情发生了}
TMember(Members[I]).AcceptMemberVisitor(Visitor);
finally
Visitor.Free;
end;
{类成员的代码生成完毕}
Output.WriteLine(''''end;'''');
end;
Delphi实例
正在组织
//很多摘自《设计模式》,
上一页 [1] [2] [3] [电脑技术]简单描述计算机辅助教学CAI [系统软件]InstallShield Express for delphi制作安装程序定… [常用软件]InstallShield Express制作Delphi数据库安装程序 [Delphi程序]为什么选择Delphi.Net ? [Delphi程序]《关于VisiBroker For Delphi的使用》(4) [Delphi程序]Delphi 程序员代码编写标准指南 [Delphi程序]转贴:Conversion to Delphi 6: Missing unit Pro… [Delphi程序]Borland Delphi 9 的新特性 [Delphi程序]Delphi 键盘码表 [Delphi程序]Chuck Jazdzewski的离开意味着Delphi的终结吗?
|