.net框架中有很广泛的应用。下面是一个实例(命名为 IntfConstraint)。
首先,需要声明一个接口:
1. type
2. IGetValue = interface
3. ['{60700EC4-2CDA-4CD1-A1A2-07973D9D2444}']
4. function GetValue: Integer;
5. procedure SetValue (Value: Integer);
6. property Value: Integer
7. read GetValue write SetValue;
8. end;
接下来我们定义一个类实现这个接口:
1. TGetValue = class (TSingletonImplementation, IGetValue)
2. private
3. fValue: Integer;
4. public
5. constructor Create (Value: Integer); // = 0);
6. function GetValue: Integer;
7. procedure SetValue (Value: Integer);
8. end;
精彩内容从下面开始,接着我们定义一个泛型类,这泛型类被限定了是实现了(我们上面定义的)指定的接口:
1. TInftClass = class
2. private
3. val1, val2: T; // or IGetValue
4. public
5. procedure Set1 (val: T);
6. procedure Set2 (val: T);
7. function GetMin: Integer;
8. function GetAverage: Integer;
9. procedure IncreaseByTen;
10. end;
这个类的泛型方法如下:
1. function TInftClass.GetMin: Integer;
2. begin
3. if Assigned (val1) and Assigned (val2) then
4. Result := min (val1.GetValue, val2.GetValue)
5. else
6. Result := 0;
7. end;
8.
9. procedure TInftClass.IncreaseByTen;
10. begin
11. if Assigned (val1) and Assigned (val2) then
12. begin
13. val1.SetValue (val1.GetValue + 10);
14. val2.SetValue (val2.GetValue + 10);
15. end;
16. end;
有了如上的定义,我们可以这样使用这个泛型类(数值型参数,接着还有其他类型参数的):
1. procedure TFormIntfConstraint.btnValueClick(Sender: TObject);
2. var
3. iClass: TInftClass;
4. begin
5. iClass := TInftClass.Create;
6. try
7. iClass.Set1 (TGetValue.Create (5));
8. iClass.Set2 (TGetValue.Create (25));
9. Log ('Average: ' + IntToStr (iClass.GetAverage));
10. iClass.IncreaseByTen;
11. Log ('Min: ' + IntToStr (iClass.GetMin));
12. finally
13. iClass.val1.Free;
14. iClass.val2.Free;
15. iCLass.Free;
16. end;
17. end;
GetValue接口)的实现:
1. // IGetValue 的第二种实现,对TButton对象
2. TButtonValue = class (TButton, IGetValue)
3. public
4. function GetValue: Integer;
5. procedure SetValue (Value: Integer);
6. class function MakeTButtonValue (
7. Owner: TComponent; Parent: TWinControl): TButtonValue;
8. end;
中,生成按钮坐标位置(随机位置,在父对象中)的成员函数,这个和主题关系不大,所以收缩
1. // ButtonValue 成员函数,用来生成按钮的坐标位置
2. class function TButtonValue.MakeTButtonValue(Owner: TComponent;
3. Parent: TWinControl): TButtonValue;
4. begin
5. Result := TButtonValue.Create(Owner);
6. Result.Parent := Parent;
7. Result.SetBounds(
8. Random (Parent.Width), Random (Parent.Height),
9. Result.Width, Result.Height);
10. Result.Caption := 'btnv';
11. end;
中GetVaule和SetValue实现:
1. // ButtonValue 中实现GetValue 和SetValue
2. function TButtonValue.GetValue: Integer;
3. begin
4. Result := Left;
5. end;
6.
7. procedure TButtonValue.SetValue(Value: Integer);
8. begin
9. Left := Value;
10. end;
下面是第二种(按钮坐标)泛型类的使用:
1. // 主窗体中测试第二种(按钮的位置)泛型调用
2. procedure TFormIntfConstraint.btnValueButtonClick(Sender: TObject);
3. var
4. iClass: TInftClass;
5. begin
6. iClass := TInftClass.Create;
7. try
8. iClass.Set1 (TButtonValue.MakeTButtonValue (self, ScrollBox1));
9. iClass.Set2 (TButtonValue.MakeTButtonValue (self, ScrollBox1));
10. Log ('Average: ' + IntToStr (iClass.GetAverage));
11. Log ('Min: ' + IntToStr (iClass.GetMin));
12. iClass.IncreaseByTen;
13. Log ('New Average: ' + IntToStr (iClass.GetAverage));
14. finally
15. iClass.Free;
16. end;
17. end;