Если вы хотите получить доступ к определенным методам, которые представлены в Specific2 (и, следовательно, не определены в его базовом классе, Base2), у вас нет другого выбора, кроме как привести его.
Если вы не используете дженерики (в C # f.e.):
public abstract class Base1<T> where T : Base2
{
public abstract void DoStuff( T b );
}
public class Specific1 : Base1<Specific2>
{
public override void DoStuff( Specific2 b ) {}
}
Но это накладывает ограничение на ваш класс Specific1
, то есть вы можете передавать только Specific2
экземпляров в метод DoStuff
.