接口中as的用法。。(30分)

  • 主题发起人 主题发起人 javesun
  • 开始时间 开始时间
J

javesun

Unregistered / Unconfirmed
GUEST, unregistred user!
type
ICompare = interface
['{DDFE0840-E8FB-11D2-9085-0040F6741DE2}']
function CompareWith(ACompare: ICompare
ASortBy: Integer): Integer;
end;

TEmployeeOrder = (eoName, eoSalary);

IEmployee = interface
['{FFCD24F0-4FE8-11D3-B84D-0040F67455FE}']
function GetName: string;
function GetSalary: Double;
end;
TEmployee = class(TInterfacedObject, IEmployee, ICompare)
private
FName: string;
FSalary: double;
public
constructor Create(AName: string
ASalary: Double);
function CompareWith(ACompare: ICompare;
ASortBy: Integer): Integer;
function GetName: string;
function GetSalary: Double;
end;
implementation
function TEmployee.CompareWith(ACompare: ICompare;
ASortBy: Integer): Integer;
var
Emp: IEmployee;
begin
Result := 0;

Emp := ACompare as IEmployee
//这一句不明白。。。。[:(][:(][:(]

case ASortBy of
Ord(eoName):
Result := CompareStr(FName, Emp.GetName);

Ord(eoSalary):
if FSalary < Emp.GetSalary then
Result := -1
else if FSalary > Emp.GetSalary then
Result := 1
else
Result := 0;
end;
end;

constructor TEmployee.Create(AName: string
ASalary: Double);
begin
inherited Create;
FName := AName;
FSalary := ASalary;
end;

以上有省略。。。。。
Emp := ACompare as IEmployee...
1、两个接口没有任何关系,这个地方用as作什么?
2、哪位高人能详细解释一下as的用法。。。
 
我也是菜鸟一个,瞎说几句.
ACompare as IEmployee 将参数 ACompare转换为 IEmployee接口.上面的 TEmployee实现了两个接口.我的理解是 IEmployee接口和ICompare接口只是将数据和行为给分离了!
CompareWith方法中参数为ICarpare接口,而没有定义为IEmployee,是因为它不知道有其他的接口,如果以后比较的内容改变了!他可以随意比较,比如要求比较的不是FName,FSalery而是比较age,等,那我可以再定义一个接口IAge,具体的实现由实现类来处理。这样一来,接口和实现就分离开了,这也是接口的用处所在。
偶菜鸟一个.请高手解答!
 
自己顶一下
 
总有爱 说得很正确3
这样实现还有一个好处就是把一个类的功能通过不同的接口而提供给不同的用户。
但是对Emp := ACompare as IEmployee
如果ACompare接口对应的类并没有实现IEmployee接口的话,就会出异常。
实际上,我觉得从接口分离应用的角度来说,接口转换并不是一个什么好做法。
我也菜鸟,瞎说两句
 
Emp := ACompare as IEmployee;
这一句的意思是增加一个引用计数,不会让它释放,如果不加了的,你后面去存取的时候有可能返回一个地址错误的
 
后退
顶部