首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

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

2012-03-14 
初学接口,不懂INGunit Unit1interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, C

初学接口,不懂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; 

热点排行