web-dev-qa-db-fra.com

Accessibilité incohérente: la classe de base est moins accessible que la classe

J'ai donc une classe de base abstraite dans un DLL et les classes enfants de cette classe. Je veux que les enfants soient publics, mais la base soit privée afin qu'elle ne soit pas accessible en dehors de la dll .

Comment je fais ça?

18
Ivan Prodanov

Vous ne le faites pas et vous ne pouvez pas.

Si vous souhaitez exposer la classe en tant que public, le type de base doit être public. Une autre option consiste à avoir un public interface, et n'exposer le type que via interface (vraisemblablement avec une méthode d'usine quelque part pour créer des instances).

Une dernière option consiste à encapsuler la classe de base plutôt que d'en hériter.

29
Marc Gravell

Faites-le public, faites tous les constructeurs internal (si vous utilisez le constructeur par défaut, ajoutez un constructeur sans paramètre pour remplacer cela).

Puis, bien que public et non scellé, il ne peut pas être sous-classé par du code externe.

14
Jon Hanna

Juste pour clarifier ce que je disais dans les commentaires sur la réponse de @Marc Gravel, vous pourriez

public ChildClass : ParentClass
{

}

public ParentClass
{
   internal void MethodIdontWantToExpose()
  {

  }

}

Cela dit, un interface est probablement la meilleure solution

1
Liam