You needn't make an interface, I don't think. What I'd suggest is:
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:
TMyBaseObj = class
PMyBaseObj = ^TMyBaseObj;
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!
with MyObj^ as TMySubObj do begin
Health := 0;
Color := clUgly;
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.