Ce n'est pas possible, pourquoi ?
En C#, on vous impose que si vous héritez de méthodes publiques, vous devez les rendre publiques. Sinon, on s'attend à ce que vous ne dériviez pas de la classe en premier lieu.
Au lieu d'utiliser la relation is-a, vous devriez utiliser la relation has-a.
Les concepteurs du langage ne le permettent pas exprès pour que vous utilisiez l'héritage plus correctement.
Par exemple, on pourrait accidentellement confondre une classe Car qui dérive d'une classe Engine pour obtenir sa fonctionnalité. Mais un moteur est une fonctionnalité qui est utilisée par la voiture. Il faut donc utiliser la relation has-a. L'utilisateur de la voiture ne veut pas avoir accès à l'interface du moteur. Et la voiture elle-même ne doit pas confondre les méthodes du moteur avec les siennes. Ni les futures dérivations de la voiture.
Ils ne permettent donc pas de vous protéger des mauvaises hiérarchies d'héritage.
Que devriez-vous faire à la place ?
Vous devez plutôt implémenter des interfaces. Cela vous laisse libre d'avoir des fonctionnalités en utilisant la relation has-a.
Autres langues :
En C++, il suffit de spécifier un modificateur avant la classe de base de private, public ou protected. Cela rend tous les membres de la base qui étaient publics au niveau d'accès spécifié. Il me semble idiot que l'on ne puisse pas faire la même chose en C#.
Le code restructuré :
interface I
{
void C();
}
class BaseClass
{
public void A() { MessageBox.Show("A"); }
public void B() { MessageBox.Show("B"); }
}
class Derived : I
{
public void C()
{
b.A();
b.B();
}
private BaseClass b;
}
Je comprends que les noms des classes ci-dessus sont un peu discutables :)
Autres suggestions :
D'autres ont suggéré de rendre A() et B() publics et de lancer des exceptions. Mais cela ne fait pas une classe conviviale pour les gens et cela n'a pas vraiment de sens.