You needn't make an interface, I don't think. What I'd suggest is:
Code:
type
  TMyBaseObj = class
  end;
  PMyBaseObj = ^TMyBaseObj;
Then you can make an array of PMyBaseObj, test it for nil or assigned, and then dereference the pointer any time you want. No interface needed! You can also typecast the dereferenced pointer in a:
Code:
with MyObj^ as TMySubObj do begin
  Health := 0;
  Color := clUgly;
end;
And so on. Or, you could have a variable of the given type and then dereference and typecast into it. Thankfully there are a great many ways to do this!

The only time you need to do an interface type is when you're passing objects from a DLL into an application. (Found that out the hardest way: lots of crashing.)

I thought of some of this stuff while contemplating a template system for a game. That sort of thing can get a bit messy, since any given template may have variable information. So I pondered on it for a good bit and these two posts are the conclusion I came down to. Unless you wanted to go for a hashlist type.