读书人

初学接口不懂ING,该如何处理

发布时间: 2012-03-14 12:01:12 作者: rapoo

初学接口,不懂ING
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,ComObj,
Dialogs, StdCtrls;

type

IField = interface
['{87BE8B28-ABD6-49C2-B5F2-E7912DFC2D8F}']
procedure SetValueText(Text: string);
end;

TMemFields = class(TContainedObject, IField)
private
public
procedure SetValueText(s: String);
end;

TMemDataSet = class(TContainedObject)
private

function GetFields : IField;
public
FMemFields: TMemFields;
constructor Create();
destructor Destroy;override;
property Fields : IField read GetFields;
end;

TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
FList: TList;
mem: TMemDataSet;
{ Private declarations }
public

{ Public declarations }
end;
var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
mem := TMemDataSet.Create;
end;



procedure TForm1.Button1Click(Sender: TObject);
var
Field: IField;
begin
mem.FMemFields.SetValueText('a');
Field:= mem.FMemFields;///////////////////////////////这里报违规错误。为什么
Field.SetValueText('b');
end;

{ TMemDataSet }

constructor TMemDataSet.Create;
begin
FMemFields := TMemFields.Create(self);
end;

destructor TMemDataSet.Destroy;
begin
FMemFields.Free;
inherited;
end;

function TMemDataSet.GetFields: IField;
begin
Result := FMemFields;
end;


{ TMemFields }

procedure TMemFields.SetValueText(s: String);
begin
showmessage(s);
end;

end.





[解决办法]
楼主在定义TMemDataSet时,在Public区域中同时定义了
FMemFields: TMemFields;
property Fields : IField read GetFields;
而属性Fields的读方法就是返回的FMemFields,所以这里的FMemFields: TMemFields; 定义是多于的应将其移至Private或是Protected区域中。另将建议将属性Fields的读方法改为:
function TMemDataSet.GetFields: IField;
begin
if not Supports(mem.FMemFields, Result) then
Result := Nil;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
Field: IField;
begin
mem.FMemFields.SetValueText( 'a ');
Field:= mem.Fields; //mem.FMemFields;///////////////////////////////这里报违规错误。为什么
Field.SetValueText( 'b ');
end;

读书人网 >.NET

热点推荐