作者:笑看天下 | 来源:互联网 | 2023-07-19 11:00
我正在使用最新的Delphi 10.3.3
我有几个主要的类,它们是从同一个父类扩展而来的,也有一些我们也称之为父类的反射类。我希望主类的实例具有指向相应反射实例的链接,但是我遇到了这个问题(我将其简化为该示例):
主要类别:
TMainClass = class
Link: TReflectionClass;
end;
TCarMainClass = class(TMainClass)
Link: TCarReflectionClass;
end;
反射类别:
TReflectiOnClass= class;
TCarReflectiOnClass= class(TReflectionClass);
问题出在链接字段中。我希望将TCarMainClass中的Link字段直接定义为TCarReflectionClass,以避免在很多代码段上进行类型转换(也冒着一些错误的风险),但是,如果我这样定义类,则TCarMainClass.Link只会隐藏TMainClass.Link-它是定义为具有相同名称的不同字段。那不是很好,因为它会占用额外的内存,并且主要是我无法从父类访问我想要的字段(作为指向通用实例的指针)。
当然,我可以通过将字段设置为公共类型私有并定义用于在每个类中处理重新输入的属性设置器/获取器来解决此问题。但这对于这些类来说是很多额外的代码,而且由于调用getter / setter方法,每个get / set的开销也很大。
我的问题是-我错过了一些简单的技巧,告诉编译器我希望子类中的字段与父类中的某些字段占用相同的内存位置吗?
谢谢
主要是我无法从父类访问该字段
虽然父类确实不能访问后代的字段,但没有什么可以阻止您同步2。
procedure TCarMainClass.SetLink(const Value : TCarReflectionClass);
begin
FLink := Value;
TMainClass(Self).FLink := Value;
end;
现在,如果您绝对不需要使用额外的内存,也不需要设置器,那么唯一剩下的选项(我现在可以想到的)就是GolezTrol建议的泛型。
TMainClass = class
Link: T;
end;
TCarMainClass = class(TMainClass)
end;
但这可能会破坏您的设计,因为TCarMainClass将与TMainClass
不兼容。 (如果您想了解原因,则搜索术语协方差/相反)。