好吧,正如您已经知道的那样,您不能有多个插件通过继承来扩展现有类。它会混淆任何应用程序,包括任何程序员处理代码。
您需要的是 TCustomer 类中的某种类型的注册机制,其中每个插件都可以注册其特定属性,或者在创建(初始化)、加载、存储或删除 TCustomer 实例时提供几个回调函数。毕竟,核心 TCustomer 真的不需要了解更多关于插件的信息,而不是它们可能存在的事实。
根据您打算如何加载/存储数据,核心 TCustomer 类甚至不必知道扩展。使持久性机制了解插件并提供一种方法来注册回调函数就足够了,以便在 TCustomer / TOrder / TWhatever 被初始化/加载/保存/删除时调用。
您还必须让 GUI 了解插件并为它们提供注册 UI 片段的方法,以便让主 GUI 为每个插件的特定控件创建一个额外的选项卡或类似的选项卡。
抱歉没有代码示例。我自己还没有实现这个,虽然我考虑过这个设计并且它在我的列表中。
也就是说,为了给您一个想法,基本机制可能如下所示:
TBaseObject = class; // forward declaration
// Class that each plug-in's extensions of core classes needs to inherit from.
TExtension = class(TObject)
public
procedure Initialize(aInstance: TBaseObject);
procedure Load(aInstance: TBaseObject);
procedure Store(aInstance: TBaseObject);
procedure Delete(aInstance: TBaseObject);
end;
// Base class for all domain classes
TBaseObject = class(TObject)
private
MyExtensions: TList<TExtension>;
public
procedure RegisterExtension(const aExtension: TExtension);
procedure Store;
end;
procedure TBaseObject.RegisterExtension(const aExtension: TExtension);
begin
MyExtensions.Add(aExtension);
end;
procedure TBaseObject.Store;
var
Extension: TExtension;
begin
// Normal store code for the core properties of a class.
InternalStore;
// Give each extension the opportunity to store their specific properties.
for Extension in MyExtensions do
Extension.Store(Self);
end;