| 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] |