类的继承问题 ( 积分: 50 )

  • 主题发起人 主题发起人 喜之狼
  • 开始时间 开始时间

喜之狼

Unregistered / Unconfirmed
GUEST, unregistred user!
设定一个标志位 判断标志位的值决定一个类 继承于哪个类 代码应该怎么实现
if flag=1 then Ttype =class(Tclass1)
if flag=2 then Ttype =class(Tclass2)
大概就是这个意思 不知道说明白没有
 
设定一个标志位 判断标志位的值决定一个类 继承于哪个类 代码应该怎么实现
if flag=1 then Ttype =class(Tclass1)
if flag=2 then Ttype =class(Tclass2)
大概就是这个意思 不知道说明白没有
 
Object Pascal里面可没这种东西,还是设计模式方面考虑为好。
 
建议斑竹不要用
if flag=1 then Ttype =class(Tclass1)
if flag=2 then Ttype =class(Tclass2)
这样的方式来继承类
要不然Ttype的每一个动作都的经过flag的判断了。那样的话还不如设两个呢!

楼主要实现什么样的功能,具体说一下,看看能不能从实际情况解决啊!
 
procedure Tform1.formcreate(Sender: TOBject);
var
I:Integer;
begin
formlist[1]:=Tform2.create(application);//自己調用窗體
formlist[2]:=Tform3.create(application);//自己調用窗體
for I:=1 to 2 do
formlist.show;
end;
 
倒,其实delphi的类引用早就实现你的要求了!
 
function TTypeFactory(flag:integer):TType
begin
if flag=1 then Result=Tclass1.create
if flag=2 then Result=Tclass1.create
end;
 
不要用你那种方法判断并继承类
试试在判断了flag值的情况下,用强制类型转换或as运算符,然后再创建对象。
 
我不是要这么判断
只是想寻求一种思路 来实现 至于 代码 只是为了说的更明白 -_-!
有什么好的思路么
具体来说 想实现的是 根据条件的不同 程序中实现 一个类对另一个类的继承 因为程序中会多次调用一个类 而这个类 需要根据情况继承于另一个类
 
to ak_2005,
类的引用 不太清楚 可以具体说一下么
 
所谓类引用类型(class-reference type)是一种"类的类"(class of class)类型,也称做元类。
详细见其它相关书籍。
 
Ttype =class(Tclass1)这样的类的继承代码是让编译器看的,if flag=1 then 这个条件判断则是需要在运行时作的,编译之后运行时那还有Ttype =class(Tclass1)这样的东东?类的继承不让编译器知道,它还怎么编译生成正确的执行代码?
想根据不同条件继承不同的类,那应该通过条件编译指令。如
const
Flag = 0;

type
{$IF Flag<=1}
TMyClass = class(TList);
{$ELSEIF Flag=2}
TMyClass = class(TThreadList);
{$ELSE}
TMyClass = class(TStringList);
{$IFEND}

procedure TForm1.N3Click(Sender: TObject);
var
O: TMyClass;
begin
O := TMyClass.Create;
ShowMessage(O.ClassParent.ClassName);
O.Free;
end;
 
看一下设计模式吧,
象抽象工厂、工厂方法、构造器等都可以解决你的问题。
 
to lichengbin
编译开关的方法应该可以 (不过到现在没有调试出你的例子 type的位置在。。 有相关的资料么)但是程序编译后似乎就没有办法更改了吧,虽然这样也可以满足我现在的需求 可以如果我想程序编译后运行中更改应该怎样做?
to ak_2005,zhukewen, 能否提供一些参考资料 谢谢大家 wenton@163.com
 
偶觉得用类引用好象不行
类引用用来动态创建出相应的类
而他这是需要动态的设计类,定义一个类
用编译器指令估计还行
 
@@ ak_2004 .....是 ak_2005么
编译指令编译成exe后似乎不能更改了 (临时看的 不知道理解的对不对)
 
编译指令编译成exe后似乎不能更改了

是的,
其实你可以定义两个类
在需要的时候在用类引用来创建需要的类
 
偶是ak_2004不是ak_2005
 
to 喜之狼:
//lichengbin的有点小问题,改下就ok了。
//关于类引用《Delphi面向对象编程思想》有详细介绍
unit Unit1;

interface

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

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

const
Flag = 0;
type
{$IFDEF Flag <=1}
TMyClass = class(TList)
{$ELSEIF Flag=2}
TMyClass = class(TThreadList)
{$ELSE}
TMyClass = class(TStringList)
{$ENDIF}
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
O: TMyClass;
begin
O := TMyClass.Create;
ShowMessage(O.ClassParent.ClassName);
O.Free;
end;

end.
//to lichengbin:
//为何始终执行ELSE部分?Flag没用啊
 
不是IFDEF..ENDIF,是IF..IFEND,我可是写得清清楚楚的哦[:D],仔细看看Delphi的编译指令部分的帮助吧
完整代码,再有问题,到http://lichengbin.iii-grp.com/Test.rar下载源代码和EXE去。

unit Unit1;

interface

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

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

var
Form1: TForm1;

implementation

{$R *.dfm}

const
Flag = 0;

type
{$IF Flag<=1}
TMyClass = class(TList);
{$ELSEIF Flag=2}
TMyClass = class(TThreadList);
{$ELSE}
TMyClass = class(TStringList);
{$IFEND}

procedure TForm1.Button1Click(Sender: TObject);
var
O: TMyClass;
begin
O := TMyClass.Create;
ShowMessage(O.ClassParent.ClassName);
O.Free;
end;

end.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
358
import
I
后退
顶部