请教,关于类多态的问题!!(50分)

  • 主题发起人 主题发起人 chinaweiling
  • 开始时间 开始时间
C

chinaweiling

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟,从TComponent类中继承了两个子类Ttest1和Ttest2,除了使用类的多态外
有什么办法能用一个变量分别调用Ttest1或Ttest2。
 
方法同名不同参 用OVERLOAD。
 
用一个变量分别调用Ttest1或Ttest2?
你就
var
tmpCmp: TComponent;
然后
if tmpCmp is Ttest1 then不可以么?
 
var
Cmp:TComponent;
...
Ttest1(Cmp).method;
Ttest2(Cmp).method;
 
用多重继承行嘛?
 
这是Delphi,不是C++,不支持多重继承
 
DELPHI怎么不支持多重继承?好多讲DELPHI的书都讲到DELPHI可以用
interface来实现多重继承。
 
同意伊天仇
DELPHI不支持多重继承,那是实现多个接口,与多重继承比较相识
 
这样吧。先抽象一个接口:
ITest = interface
procedure Method1;
end;

用Test2实现接口
TTest2 = class(TComponent,ITest)
procedure Method1;
end;

再声口TTest:
tTest1 = class(TComponent,ITest)
procedure Method2;
private
FTest2:TTest2;
property Test2:TTest2 read FTest2 implements ITest;
end;

用这样就可以实现一个变量分别有TTest1,TTest2咯。
这怎么不能叫多重继承嘛。
 
各位大侠,小弟先行谢过。
伊兄,小弟对于你的方法也考虑过,但变量使用基类来定义,好像子类的方法、事件都无法使用?谢谢!
begindelphi大侠,使用类的多态时方法可以重载但事件如何处理。还请大侠给与指点。谢谢!
 
unit UCmp;

interface
type
TCmp=class
private
procedure ProCmp;
public
function FunCmp: integer;
end;
implementation

{ TCmp }

function TCmp.FunCmp: integer;
begin
//Cmp不可见
end;

procedure TCmp.ProCmp;
begin
//Cmp不可见
end;

end.
************************
unit UTest1;

interface
uses
Dialogs,UCmp, Classes;
type
Test1 =class(TComponent)
private
procedure ProTest1;
protected
procedure Test1Protected;
public
function FunTest1: integer;
end;
implementation

{ Test1 }

function Test1.FunTest1: integer;
begin
showmessage('Cmp is Test1 now!');
end;

procedure Test1.ProTest1;
begin
////Cmp不可见
end;

procedure Test1.Test1Protected;
begin
//Cmp不可见
end;

end.

*************************
unit UTest2;

interface
uses
Dialogs,UCmp;
type
Test2 =class(TCmp)
private
procedure ProTest2;
protected
procedure Test2Protected;
public
function FunTest2: integer;
end;
implementation

{ Test2 }

function Test2.FunTest2: integer;
begin
showmessage('Cmp is Test2 now!');
end;

procedure Test2.ProTest2;
begin
//
end;

procedure Test2.Test2Protected;
begin
//
end;

end.
******
unit main;

interface

uses
UTest1, UTest2, UCmp,Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Cmp: TCmp;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
Cmp:=TCmp.Create;
Test1(Cmp).FunTest1;
Test2(Cmp).FunTest2;
end;

end.
上面的代码执行成功!试试!by the way 好好的多态性为何不用?



 
还不知你要对事件怎么处理呀?
 
对事件的处理不是讨论的主题!上面的代码说明可以用强制转换的方法把父类的对象转换成
它的子类,并可以访问到子类的public的方法,而private和protected则无法访问!
 
to 伊天仇
你的方法根本就不可靠。用强制转换,只是DELPHI内存分配上的问题,很容易出错。
强制转换根本不只子,父转,要不你试试下面的代码:
program TestTypeCast;
type
TClass = clas
public
procedure TestProc;
end;
var I:Integer;

procedure TClass.TestProc;
begin
write('This is an Demo');
end;
begin
TClass(I).TestProc;
end.

那你猜猜会发生什么问题?AV?No!输出一个"This is a Demo"










 
Delphi中的“类”的实质是一个指针,指向一片内存地址。
我们用Constructor时,只是在内存中分配一片内存空间,然后把这个指针
指向这片内存。我们用指针的时候是不是有下面几种:
var PI:^Integer;
I:Integer;
begin
new(PI);//为指针分配空间;
PI:=@I;//让指针指向内存空间;
end;//同样,类的原理也是一样的。


 
to BeginDelphi:
听你一说觉得很神奇,所以试验了一下。
可我得到的结果是:
“Runtime error 105 at 00403809”
 
但DELPHI中的方法应该是静态的,也就是编译程序编译的时候就分配好了空间。
所以你Create不Create,都可以调用这些方法。

program TestTypeCast;
type
TClass = class
public
procedure TestProc;
end;

procedure TClass.TestProc;
begin
write('This is an Demo');
end;

var I:Integer;
Class1:TClass;

begin
Class1.TestProc; //会发生AV吗?NO
TClass(nil).TestProc; //看起来不可思异是吧?但一样是正常的。
end.
 
呵呵!我没有用别的,你试试用
dcc /cc XXX.dpr (/cc一定要加,不然出错)
 
要不加上:{$APPTYPE CONSOLE}
我都忘咯,呵呵!
 
当然,方法是静态的,调用是没有问题的。但是数据就有问题咯。
Constructor分配的是存储空间用来干什么呢?当然是为字段分配的。


 
后退
顶部