gpt4 book ai didi

delphi - 如何制作这个OO?

转载 作者:行者123 更新时间:2023-12-03 08:52:00 24 4
gpt4 key购买 nike

对不起,标题很抱歉,我是OOP的新手,所以我不知道我该做什么。

我有10个继承一个对象的不同对象。它们具有不同数量和类型的类成员,但它们全部具有一个共同的属性-可见。

type TSObject=class(TObject);
protected
Visible:boolean;
end;

type
TObj1=class(TSObject)
private
a:integer;
...(More members)
end;
TObj2=class(TSObject)
private
b:String;
...(More members)
end;

...(Other 8 objects)


对于他们每个人,我都有一个变量。

var Obj1:TObj1;
Obj2:TObj2;
Obj3:TObj3;
....(Other 7 objects)


规则1:一次只能初始化一个对象(其他对象必须释放)才能可见。

对于这个规则,我有一个全局变量

var CurrentVisibleObj:TSObject; //Because they all inherit TSObject


最后,有一个更改可见性的过程。

procedure ChangeObjVisibility(newObj:TSObject);
begin
CurrentVisibleObj.Free; //Free the old object
CurrentVisibleObj:=newObj; //assign the new object
CurrentVisibleObj:= ??? //Create new object
CurrentVisibleObj.Visible:=true; //Set visibility to new object
end;


我的问题是,我不知道如何初始化它,因为派生类是未知的(TObj1,TObj2,Tobj3 ...哪个?)。

我该怎么做呢?

我简化了解释,在项目中,每个TFrame具有不同的控件,我必须以相同的方式设置可见/不可见(通过仅初始化一帧)。

再次抱歉,我对OOP陌生。

最佳答案

这里的第一个问题是您似乎假设可以将未初始化的变量传递给ChangeObjVisibility。

ChangeObjVisibility(Obj3);


在这里,如果Obj3为nil(或更糟糕的是,是一个悬空的指针),则ChangeObjVisibility无法知道它需要创建的对象的类型。

获取框架类的一种方法是使用const数组或带有大小写的函数。

type
TSObjectClass = class of TSObject;
const
ObjectClasses = array[0..X] of TSObjectClass = (TObj1, TObj2, TObj3, ...)

function GetFrameclass(Index : Integer) : TSObjectClass;
begin
Result := ObjectClasses[Index]

OR

case Index of
0 : Result := TObj1;
1 : Result := TObj2;
(...)
end;
end;


如果框架不需要任何特殊的初始化,那将起作用。

接下来,您可以打一个这样的电话:

procedure ChangeCurrentFrame(NewFrameIndex : Integer);
var FrameClass : TSObjectclass;
vFrame : TSObject;
begin
FrameClass := GetFrameClass(NewFrameIndex);
if CurrentVisibleObj.ClassType <> FrameClass then
begin
vFrame := FrameClass.Create(nil);
SetCurrentFrame(vFrame);
end;
end;

procedure SetCurrentFrame(newObj:TSObject);
begin
if Assigned(CurrentVisibleObj) then
CurrentVisibleObj.Free; //Free the old object
CurrentVisibleObj:=newObj; //assign the new object
if Assigned(CurrentVisibleObj) then
CurrentVisibleObj.Visible:=true; //Set visibility to new object
end;


在这里,SetCurrentFrame替换您ChangeObjVisibility(此处您真正要做的是更改当前帧,更改可见性只是“副作用”)

关于delphi - 如何制作这个OO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2608620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com