ttest2(t1).a; // 怎样使t1执行ttest2.a过程,而不是test1.a??? ( 积分: 50 )

  • 主题发起人 主题发起人 hsgrass
  • 开始时间 开始时间
H

hsgrass

Unregistered / Unconfirmed
GUEST, unregistred user!
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Ttest1 = class(Tobject)
function IsOk: boolean
virtual;
procedure a()
virtual;
end;
Ttest2 = class(Ttest1)
function IsOk: boolean;
procedure a()
override;
public
end;


var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
t2, t22: ttest2;
t1: ttest1;
begin
t1 := ttest1.Create;
ttest2(t1).a
// 怎样使t1执行ttest2.a过程,而不是test1.a??
t1.free;
end;

{ Ttest1 }

procedure Ttest1.a;
begin
if not IsOk then
ShowMessage('do right!!');
end;

function Ttest1.IsOk: boolean;
begin
result := true;
end;

{ Ttest2 }

procedure Ttest2.a;
begin
if not IsOk then
showmessage('test2 ok ');
end;

function Ttest2.IsOk: boolean;
begin
result := false;
end;

end.
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Ttest1 = class(Tobject)
function IsOk: boolean
virtual;
procedure a()
virtual;
end;
Ttest2 = class(Ttest1)
function IsOk: boolean;
procedure a()
override;
public
end;


var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
t2, t22: ttest2;
t1: ttest1;
begin
t1 := ttest1.Create;
ttest2(t1).a
// 怎样使t1执行ttest2.a过程,而不是test1.a??
t1.free;
end;

{ Ttest1 }

procedure Ttest1.a;
begin
if not IsOk then
ShowMessage('do right!!');
end;

function Ttest1.IsOk: boolean;
begin
result := true;
end;

{ Ttest2 }

procedure Ttest2.a;
begin
if not IsOk then
showmessage('test2 ok ');
end;

function Ttest2.IsOk: boolean;
begin
result := false;
end;

end.
 
procedure TForm1.FormCreate(Sender: TObject);
var
t2, t22: ttest2;
t1: ttest1;
begin
t2 := ttest2.Create;
ttest2.a
// 怎样使t1执行ttest2.a过程,而不是test1.a??
t2.free;
end;
呵呵。。继承晕了?
 
可以ttest1(t2),但ttest2(t1)。可以把继承类变为父类,但反过来不行。
 
谢谢你的回答.

我说得不清楚吧 :)

有一个ttest1的实例存在,它里面有Ttest1.IsOK函数固定返回true,还有一个调用IsOk判断才执行的过程,

我需要使它的IsOK返回true.然后再执行它自己的test1.a过程。

请问怎样实现?
 
你是不是想:当基类test1中的IsOK为true时,再执行test2中的a?
 
使基类(ttest1)的isOk返回false,执行它自己的a过程
 

那位指条明路啊:)
 
无意义,即使实现也是钻门子,不如这样:
procedure TForm1.FormCreate(Sender: TObject);
var
t2, t22: ttest2;
t1: ttest1;
begin
t1 := ttest2.Create;
ttest2(t1).a
t1.free;
end;
 
同意楼上,既然父类中的对象不可以转化成子类的对象,那干脆考虑定义自类对象不就行了
 
既然是继承,那子类中也有isok方法,
不知道为什么你非要定义一个与父类方法相反的方法;
 
procedure TForm1.FormCreate(Sender: TObject);
var
t2, t22: ttest2;
t1: ttest1;
begin
t1 := ttest2.Create
//用ttest2类创建
ttest2(t1).a

t1.free;
end;
 
后退
顶部