Рассмотрим интерфейс типа
IMyInterface = interface
procedure DoSomethingRelevant;
procedure Load (Stream : TStream);
procedure Save (Stream : TStream);
end;
и несколько классов, которые реализуют интерфейс:
TImplementingClass1 = class (TInterfacedObject, IMyInterface)
...
end;
TImplementingClass2 = class (TInterfacedObject, IMyInterface)
...
end;
...
У меня есть класс со списком разработчиков IMyInterface:
TMainClass = class
strict private
FItems : TList <IMyInterface>;
public
procedure LoadFromFile (const FileName : String);
procedure SaveToFile (const FileName : String);
end;
Теперь к вопросу: как я могу загрузить основной класс и особенно список элементов объектно-ориентированным способом? Прежде чем я смогу вызвать виртуальный метод Load для элементов, я должен создать их и, следовательно, знать их тип. В моей текущей реализации я сохраняю количество элементов, а затем для каждого элемента
- идентификатор типа (IMyInterface получает дополнительную функцию GetID)
- вызов метода сохранения элемента
Но это означает, что во время загрузки я должен сделать что-то вроде
ID := Reader.ReadInteger;
case ID of
itClass1 : Item := TImplementingClass1.Create;
itClass2 : Item := TImplementingClass2.Create;
...
end;
Item.Load (Stream);
Но, похоже, это не слишком объектно-ориентировано, поскольку мне приходится каждый раз возиться с существующим кодом, когда я добавляю нового разработчика. Есть ли лучший способ справиться с этой ситуацией?