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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于多态的理解,有助于理解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抽象类的多态机制。的主要内容,如果未能解决你的问题,请参考以下文章

详细的解释下类的封装性,抽象性,继承性和多态性。

关于类的理解

php类的封装继承和多态的简单理解

PHP面向对象三大特点学习(充分理解抽象封装继承多态)

java中对于多态的理解

面向对象之多态性(接口类)和抽象类