Вам не нужно, чтобы проверить типы, чтобы делать то, что вы хотите сделать. Вы должны посмотреть на шаблон посетителя. Вы можете найти всю информацию об этом в книге 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, которая возвращает enum, и каждый производный должен переопределить это перечисление, чтобы ExternalClass знал, какой код он должен выполнить.
+1 солидный совет. Если вы когда-либо обнаруживаете, что используете тип класса в дереве наследования, вы, вероятно, делаете что-то неправильно. – womp
благодарит за то, что дал мне понять, что я ошибаюсь. это полезно. – Jason
@womp - что делать, если я в UserControl, который имеет «BaseClass» в качестве члена, и должен инстанцировать его только с помощью идентификатора, переданного ему в качестве параметра. Как узнать, какой производный класс был создан для создания экземпляра, если я также не передам что-то вроде перечисленного значения, чтобы сообщить ему, какой из них? – Jason