现在的位置: 首页 > 综合 > 正文

娃娃鸭Delphi面向对象编程思想刘艺笔记

2013年09月14日 ⁄ 综合 ⁄ 共 4401字 ⁄ 字号 评论关闭

 

1、  自动生命周期的整理

unit mtReaper;

 

interface

type

  ImtReaper = interface

    ['{F3E97960-3F35-11D7-B847-001060806215}']

  end;

 

  TmtReaper = class(TInterfacedObject, ImtReaper)

  private

    FObject: TObject;

  public

    constructor Create(AObject: TObject);

    destructor Destroy; override;

  end;

 

implementation

 

uses SysUtils;

 

constructor TmtReaper.create(AObject: TObject);

begin

  FObject := AObject;

end;

 

destructor TmtReaper.Destroy;

begin

  FreeAndNil(FObject);

  inherited;

end;

 

end.

 

=====================================================================

unit frmMain;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;

 

type

  TNoisyDeath = class(TObject)

  public

    destructor Destroy; override;

  end;

 

  TForm1 = class(TForm)

    Button1: TButton;

    Button2: TButton;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

  private

    procedure WaitAWhile;

  public

    { Public declarations }

  end;

 

 

 

var

  Form1: TForm1;

 

implementation

uses mtReaper;

{$R *.dfm}

 

destructor TNoisyDeath.Destroy;

begin

  showMessage('对象销毁了!');

  inherited;

end;

 

procedure TForm1.WaitAWhile;

var

  i: Integer;

begin

  for i := 0 to 5000 do

  begin

    caption := Inttostr(i);

  end;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

var

  NoisyDeath: TNoisyDeath;

begin

  NoisyDeath := TNoisyDeath.create;

  try

    waitAWhile;

  finally

    NoisyDeath.Free;

  end;

 

end;

 

procedure TForm1.Button2Click(Sender: TObject);

var

  NoisyDeath: TNoisyDeath;

  girm: ImtReaper;

begin

  NoisyDeath := TNoisyDeath.create;

  girm := TmtReaper.Create(NoisyDeath);

  waitAWhile;

end;

 

end.

 

Decorator模式

·在不影响其他对象的情况下,以动态、透明度的方式给单个对象添加职责

·处理那些可以撤消的职责

·当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长;另一种情况可能是,因为类定义被隐藏,或类定义不能用于生成子类。

自动恢复字体

unit uSnapshot;

 

interface

 

uses SysUtils, mtReaper,classes;

 

type

  ISnapshot=interface

    ['{FA256FA8-211F-462D-890B-FC0EB6096AD8}']

    procedure Restore;

  end;

 

  TSnapshot=class(TInterfacedObject,ISnapshot)

  private

    FOriginal:TPersistent;

    FTarget:TPersistent;

    FReaper:ImtReaper;

  public

    constructor Create(Target:TPersistent);

    destructor Destroy;override;

    procedure Restore;

  end;

 

implementation

 

constructor TSnapshot.create(Target:TPersistent);

begin

  FOriginal:=TPersistent(Target.classType.create);

  FReaper:=TmtReaper.create(FOriginal);

  FTarget:=Target;

  FOriginal.Assign(Target);

end;

 

destructor TSnapshot.Destroy;

begin

  restore;

  Inherited;

end;

 

procedure TSnapshot.Restore;

begin

  if FTarget<>nil  then

    FTarget.Assign(FOriginal);

end;

end.

unit Unit1;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, ComCtrls;

 

type

  TForm1 = class(TForm)

    FontDialog1: TFontDialog;

    btnSet: TButton;

    Memo1: TMemo;

    procedure btnSetClick(Sender: TObject);

    procedure FormCreate(Sender: TObject);

    procedure WaitAWhile;

  private

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

 

implementation

 

uses uSnapshot;

 

{$R *.dfm}

 

procedure TForm1.btnSetClick(Sender: TObject);

var

  FontSnapshot: ISnapshot;

begin

  FontSnapshot := TSnapshot.Create(Memo1.Font);

  {这里可以填写可能会改变TFont状态的任何代码}

  if FontDialog1.Execute then

    Memo1.Font := FontDialog1.Font;

  Memo1.Update;

  WaitAWhile;

end;

 

procedure TForm1.FormCreate(Sender: TObject);

begin

  Memo1.Lines.Add(

    '一个模拟对象状态改变后自动恢复的例子。');

end;

 

procedure TForm1.WaitAWhile;

var i: Integer;

begin

  for i := 0 to 5000 do

  begin

    caption := '状态恢复倒计时:' + Inttostr(5000 - i);

  end;

end;

 

end.

 

这个例子确实有点份量,说明一些问题。

 

2、  TObject

1.       inheritsFrom 判断一个类是否另一类的祖先类

2.       下面三种方案是分别运行的。

procedure TForm1.onclick(Sender: TObject);

var

  str: string;

  tmpclass: TObject;

  classref: TClass;

begin

       ///第一种最简单的解决方案

  str := '';

  ListBox1.Items.Add(str);

  str := format('Class Name = %s', [sender.ClassName]);

  ListBox1.Items.Add(str);

  str := format('Class Parent = %s', [sender.ClassParent.ClassName]);

  ListBox1.Items.Add(str);

  str := format('InstanceSize = %d', [sender.InstanceSize]);

  ListBox1.Items.Add(str);

 

//以下为第二种,复杂的解决方案

  tmpclass := sender;

  while tmpClass.ClassParent <> nil do

  begin

    str := tmpclass.ClassName;

    listbox1.Items.Add(str);

    tmpclass := tmpclass.ClassParent.Create;

  end;

 

 

 {方案三}

  listbox1.Items.Add('============================');

  classref := sender.ClassType;

  while classref <> nil do

  begin

    listbox1.Items.Add(classref.ClassName);

    classref := classref.ClassParent;

  end;

end;

3、  TPersistent

1.TPersistent类在Delphi类中的地位不亚于TObject类,该类定义于Classes单元中,Delphi中定义的类几乎都是由该类派生而来的。TPersistent之所以在Delphi类中居于如此重要的地位是因为它是Delphi可视化编程的基础。该类实现了对象公布(published)属性的存取,即在该类及其派生类中声明为published的属性、方法和事件等可在设计期时显示在Object Inspector窗体或数据模块的DFM 文件中。当Delphi 重新打开原来保存的窗口时,对象的设置值将被DelphiDFM文件中读出。在程序运行期,对象将被初始化为设计期所设置的状态。

2.

{$M+}

抱歉!评论已关闭.