Вам не нужно проверять типы, чтобы делать то, что вы хотите. Вы должны посмотреть на шаблон посетителя.
Вы можете найти всю информацию об этом в книге GoF или на www.dofactory.com, но позвольте мне объяснить мою точку зрения:
Ваш внешний класс будет реализовывать интерфейс IVisitor, который будет иметь методы DoDerivedA (), DoDerivedB и DoDerivedC. После этого вам нужно добавить в BaseClass виртуальную функцию, которая будет использовать ваш внешний класс:
public virtual void DoExternal(IVisitor v){}
DerivedA переопределит этот метод следующим образом:
v.DoDerivedA();
После этого у вас будет что-то подобное в вашем Внешнем:
AcceptBaseByExternal(BaseClass derivedInstance)
{
derived.DoExternal(this);
}
Это будет делать все, что вы хотите в соответствии с фактическим типом класса. Все, что вам нужно, это создать специальный метод для каждого производного класса.
Когда я писал это, я также думал, что вы можете создать один метод в вашем ExternalClass вместо одного метода для одного производного класса и параметризовать его с помощью какого-либо параметра. Например. реализовать виртуальную функцию в BaseClass, которая возвращает перечисление, и каждый производный должен переопределить это перечисление, чтобы ExternalClass знал, какой код он должен выполнять.