关于“类派生的访问”问题~~~~~~~~~大虾就命啊~~~~~急、急、急~~~~在线等 ( 积分: 50 )

  • 主题发起人 主题发起人 镀金的乞丐
  • 开始时间 开始时间

镀金的乞丐

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在CheckListBox控件中加入一个属性ItemValue,用于记录每一个Item对应的一个特殊数值。
CheckLst.pas中TCheckListBox的原型如下:
type
TCheckListBox = class(TCustomListBox)
private
......
protected
......
procedure SetItemData(Index: Integer; AData: LongInt); override;
function GetItemData(Index: Integer): LongInt; override;
//我认为这两个方法就是TCheckListBox提供好的存取Item数值的方法
//只是处于保护状态,外部无法直接访问
......
end;

于是我以TCheckListBox为父类,派生了一个新类TCheckValueListBox如下:
type
TCheckValueListBox = class(TCheckListBox)
private
......
public
......
property ItemValue[Index: Integer]: integer read GetItemData write SetItemData;
......
end;

按照道理,派生类可以访问父类的protected中的方法属性,所以我在派生类中使用父类的GetItemData、SetItemData方法应该没错的;派生类的ItemValue属性在public中,所以用派生类实例化的对象,就可以直接访问ItemValue,这也应该没错啊,可是编译就是通不过~~求各位大虾救命啊
 
我想在CheckListBox控件中加入一个属性ItemValue,用于记录每一个Item对应的一个特殊数值。
CheckLst.pas中TCheckListBox的原型如下:
type
TCheckListBox = class(TCustomListBox)
private
......
protected
......
procedure SetItemData(Index: Integer; AData: LongInt); override;
function GetItemData(Index: Integer): LongInt; override;
//我认为这两个方法就是TCheckListBox提供好的存取Item数值的方法
//只是处于保护状态,外部无法直接访问
......
end;

于是我以TCheckListBox为父类,派生了一个新类TCheckValueListBox如下:
type
TCheckValueListBox = class(TCheckListBox)
private
......
public
......
property ItemValue[Index: Integer]: integer read GetItemData write SetItemData;
......
end;

按照道理,派生类可以访问父类的protected中的方法属性,所以我在派生类中使用父类的GetItemData、SetItemData方法应该没错的;派生类的ItemValue属性在public中,所以用派生类实例化的对象,就可以直接访问ItemValue,这也应该没错啊,可是编译就是通不过~~求各位大虾救命啊
 
//虚函数不能用于read,write,你应该改成以下形式:
unit CheckValueListBox;

interface

uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls, CheckLst;

type
TCheckValueListBox = class(TCheckListBox)
private
{ Private declarations }
function NewGetItemData(Index: Integer): LongInt;
procedure NewSetItemData(Index: Integer; AData: LongInt);
protected
{ Protected declarations }
public
{ Public declarations }
property ItemValue[Index: Integer]: integer read NewGetItemData write NewSetItemData;
published
{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Samples', [TCheckValueListBox]);
end;

function TCheckValueListBox.NewGetItemData(Index: Integer): LongInt;
begin
Result := GetItemData(Index);
end;

procedure TCheckValueListBox.NewSetItemData(Index: Integer; AData: LongInt);
begin
SetItemData(Index, AData);
end;

end.
 
感谢dreamisx兄弟,答案接受了,请接分~~~~
 
后退
顶部