pour moi la vraie question est toujous "pourquoi tu dois accéder à ces données qui ne sont pas déclarées dans la structure de la classe de base que tu connais ?"
Je pense que ça marche mieux avec un exemple concret ou on ne peut pas déformer les choses, puisque de toutes façons la solution dépend entièrement du problème (les parties concrètes du problème pas les abstractions ^^)
De la façon dont je vois le problème "générique", quoi qu'il arrive tu en reviens a faire un cast à un moment ou un autre mais ça n'a pas forcément la même signification.
Je vois deux solutions a ton problème (de manière générique donc ce n'est pas applicable tel quel partout évidemment) soit avec de l'héritage multiple (interfaces), et il faudra quand même caster des trucs, soit en redécoupant le problème (ça revient un peu à ce que disait Twindruff aussi), et là il faudra peut-être quand même caster des trucs mais tu peux peut-être l'éviter.
La solution change si tu es dans un contexte où ta classe n'a
que N classes dérivées que tu
connais,
ou si tu es dans le contexte ou ta classe a une
infinité de classes dérivées et donc que tu ne les
connais pas toutes.
Mais pour moi le point important de la résolution reste quand même le "pourquoi je dois faire ça ?" (désolé

)