[pascal]
type
TModelLoaderClass = class of TGameInterface;

function TModelLoadingManager.LoadModel( aModelLoader : TModelLoaderClass; string : aFileName ) : TModelLoader;
begin
if aModelLoader <> nil do
begin
result := aModelLoader .Create( aFileName );
end;
end;
[/pascal]

which can then be called as

[pascal]
var
ModelToLoad : TModelLoader;
begin
ModelToLoad := MyModelLoadingManager.LoadModel( T3DSModel, 'c:\somewhere.3ds' );
ModelToLoad.DoStuffWithModel;
.
.
.
ModelToLoad := MyModelLoadingManager.LoadModel( TDirectXModel, 'c:\somewhere.x' );
ModelToLoad.DoOtherStuffWithModel;
end;
[/pascal]

I'm using this sort of factory technique in the SoAoS port to decide what interface to load and display next. It looks like this...

[pascal]
type
TGameInterfaceClass = class of TGameInterface;
var
CurrentGameInterface : TGameInterfaceClass = TGameIntro;
GameWindow : TGameInterface;

begin
while CurrentGameInterface <> nil do
begin
GameWindow := CurrentGameInterface.Create( Application );
GameWindow.LoadSurfaces;

Application.Show;
CurrentGameInterface := GameWindow.NextGameInterface;

if ( GameWindow <> nil ) then
FreeAndNil( GameWindow );
end;
end.
[/pascal]

This way I can add X new screens/interfaces without the need to update any enumeration types. I just have to make sure that when I want to display an interface that I populate the NextGameInterface variable with a game interface class type and it just works.

I'm not saying this doesn't have it's drawbacks, but I think is less of a maintenance headache than updating an enumerated list everytime I think of adding something new. Also no case statements required either. Though they can be very usefull at times.

To do something that would allow you to load one model and then save it as some other format, you will need to have one common way of holding the data in your base class or similar, then each derived class would use this stored data to convert it to what format it is familiar with. Look through the VCL and look at how TGraphic/TPicture work to see how this can be implemented.

I hope this helps.