取决于数据流(数据本身)我从一个非常简单的数据类型" AboutMe"开始,稍后取决于数据本身或我想继续使用此数据的工作流程在一个名为" AboutMe_more"的课程中。在我的程序中,此过程可能会发生1到3次。
AboutMe= class
Name : String
end;
AboutMe_more = class(AboutMe)
gender : String;
Birth : TDate;
Aboutme_complete = class (AboutMe_more)
adresss : String;
salery : Real;
.....
end;
从完整的类开始在我的情况下不是一个好主意,因为可能有一个不同的开关到其他所需的类,如
Aboutme_complete_option = class (AboutMe_more)
company : string;
city : String;
kids : String;
.....
end;
问:
a)将数据从一个类传输到派生类的最佳方法是什么,不需要将数据传输到父类。 b)良好的编程风格或者对数据运动的需求是否表明阶级结构/设计较差?
答案 0 :(得分:-1)
看起来您正在尝试使用对象建模数据库。
b)良好的编程风格或对数据运动的需求是否表明一个糟糕的阶级结构/设计?
这里的问题(正如@jpfollenius所提到的)是你最终会得到一个非常深层次的对象层次结构。
a)将数据从一个类传输到派生类[...]的最佳方法是什么?
我不了解最佳方式,但在Delphi中,通常使用重载Assign
将数据从一个对象传输到另一个对象。
TMyObject = class(TPersistent)
procedure Assign(Source: TPersistent); overload;
....
implementation
procedure TMyObject.Assign(Source: TPersistent);
begin
inherited Assign(Source);
if (Source is TMyObject) then begin
Self.Field1:= Source.Field1;
Self.Field2:= Source.Field2;
end;
end;
更明智的做法
继承只是解决此问题的一种方法。
更合适的方法是使用封装。
这里有一个对象和一个接口,用于保存数据和容器对象,使您可以访问该数据 Delphi有一个非常好的机制,因为它允许您将接口的实现委托给包含的对象。
使用带有接口和容器对象的2个数据对象的示例。
type
IData1 = interface
['{3F996D68-1FD0-4490-AE60-8F735A9DFFE8}'] //Use ctrl+alt+g to generate a number
function GetData1: integer;
procedure SetData1(value: integer);
property Data1: integer read GetData1 write SetData1;
end;
IData2 = interface
['{3F996D68-1FD0-4490-AE60-8F735A9DFFE9}']
function GetData2: integer;
procedure SetData2(value: integer);
property Data2: integer read GetData2 write SetData2;
end;
TData1 = class(TInterfacedObject, IData1);
private
FData1: integer;
protected
function GetData1: integer;
procedure SetData1(value: integer);
public
property Data: integer read GetData1 write SetData1;
end;
TData2 = class(TInterfacedObject, IData2);
{see TData1 above}
TContainer = class(TInterfacedObject, IData1, IData2)
private
FData1: TData1;
FData2: TData2;
public
constructor Create();
property Data1: TData1 read FData1 implements IData1; //delegates implementation to object FData.
property Data2: TData2 read FData2 implements IData2;
end;
从这个问题复制:https://stackoverflow.com/questions/6063274/hidden-features-in-the-delphi-language(现在遗憾地删除了)。