关于多态的理解,有助于理解TStream抽象类的多态机制。

时间:2023-03-10 03:01:09
关于多态的理解,有助于理解TStream抽象类的多态机制。

有的时候 不是很明白流的机制,因为有内存流  文件流 图片流 等等 他们之间的相互转化 靠的就是流的多态性。。。。

unit Unit11;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type
TForm11 = class(TForm)
btn1: TButton;
btn2: TButton;
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; TFuLei = class
public
function func1(): string; virtual;
end; TZiLei = class(TFuLei)
public
function func1(): string; override;
end; var
Form11: TForm11; implementation {$R *.dfm} function TFuLei.func1(): string;
begin
Exit('func1');
end; function TZiLei.func1(): string;
begin
Exit('func2');
end; /// <summary>
/// 注意这里的参数是父类,意思是如果传入子类也是可以的,因为子类拥有父类所有的功能,可以向上递归
/// 且如果子类的覆盖度了父类的方法,那么传入子类的话,delphi会自动调用子类覆盖后的方法
/// </summary>
procedure wokao(ALei: TFuLei);
begin
ShowMessage(ALei.func1);
end; procedure TForm11.btn1Click(Sender: TObject);
var
lei: TFuLei;
begin
lei := TFuLei.Create;
wokao(lei);//func1
lei.Free;
end; procedure TForm11.btn2Click(Sender: TObject);
var
lei: TZiLei;
begin
lei := TZiLei.Create;
wokao(lei);//func2
lei.Free;
end; end.

好了,现在我来证明下,是否可以 wokao的参数是子类,然后传入父类的情况,因为父类并不一定能拥有子类的全部功能。

关于多态的理解,有助于理解TStream抽象类的多态机制。

可见我的理解是对的,当时子类的时候 不允许 传入父类的实例,会编译不通过。。。