On Thursday, 14 May 2015 at 19:00:16 UTC, tired_eyes wrote:
First, I don't understand why we see array[2] as 'Child'. While
it is a 'Child', shouldn't it be shown as a 'Parent' due to we
explicitly create an array of 'Parents'?
It is getting the name through a virtual interface (a hidden one
that has typeinfo).
class Base {
string getName() { return Base; }
}
class Derived : Base {
override string getName() { return Derived; }
}
Base b = new Derived();
b.getName() == Derived; // because the virtual function can
still be called through an interface
Well, if it's still a 'Child', why we can't access it's fields?
It is a Child object, but you are talking to it through the
Parent interface, so only functions+members available on Parent
can be accessed without casting it.
And what is the proper way of storing a collection of inherited
objects without losing access to their fields and methods?
Best you can do is say
if(child = cast(Child) parentArray[0]) {
// it is a child, now use child to access that
}
Though often a better way is to add an interface method that does
it in the parent and is overridden in the child, just like with
the getName above.