7
votes

Comment puis-je créer une classe A en C #, où une ne peut être hérédirée que par B, C, D?

Il y a un mécanisme pour permettre à une classe d'être héritée de n classes uniquement en C #?


4 commentaires

Sont b , c et d dans le même assemblage?


Cela doit-il être au moment de l'exécution ou compiler le temps.


Y a-t-il une raison spécifique à vous de faire cela? Peut-être qu'un exemple réel aidera.


Ce serait intéressant si quelqu'un pouvait venir avec un hack pour cela


5 Réponses :


8
votes

Vous pouvez le mettre et les classes dérivées dans un assemblage séparé et déclarent le constructeur de la classe de base comme interne . De cette façon, bien que vous puissiez hériter d'elle dans un assemblage différent, mais vous ne seriez pas en mesure d'instancier de la classe dérivée.


10 commentaires

Comment pouvez-vous hériter mais ne pas être capable d'instancier?


@Mehrdad: Étant donné que la classe dérivée appelle le constructeur de la base, il doit avoir accès à ce constructeur. Mettre l'accès à interne permet uniquement de classes dérivées dans le même assemblage (ou des assemblages d'amis) d'appeler la base. Il convient également de noter que les classes dérivées doivent être scellées .


@Travis: Mais comment pouvez-vous faire respecter que les classes dérivées ne sont pas instanciées?


Définissez le constructeur comme privé, puis personne ne peut l'appeler.


Si je ne me trompe pas, l'OP veut mettre un numéro au nombre de classes que d'hériter d'une classe spécifique, l'instanciation de repos doit être comme cela se produise.


@Recursive: Mais vous ne pouvez pas l'hériter non plus.


Eh bien, oui, hériter nécessite la capacité d'instancier. Vous avez demandé comment vous assurer qu'ils n'étaient pas instanciés.


@Recursive: C'était évidemment dans le contexte de mon premier commentaire: Comment pouvez-vous hériter mais ne pas être capable d'instancier?


J'ai supposé que vous vouliez dire ne pas être capable d'instancier les sous-classes. Des constructeurs privés sur ces sous-classes permettent cela.


Merci pour cela. exactement ce dont j'avais besoin. Besoin de cours de la même assemblée peut hériter d'une classe abstraite, mais la classe abstraite ne doit pas nuiter d'un assemblage différent. J'ai essayé de définir la classe abstraite comme interne mais obtient une erreur de compilation que l'accessibilité n'est pas cohérente. Cela résout cependant cela. Merci!



-1
votes

Vous pouvez faire de la classe un résumé et hériter de tout nombre de classes ..


2 commentaires

Je pense que dans ce cas que n = 3


@TOM: S'il vous plaît voir la réponse donnée par Abatishchev, je voulais juste dire la même chose .. Je pensais après l'indice, repose que le questionneur peut google ...



4
votes

Non, mais vous pouvez toujours faire jeter le constructeur une exception si elle dépasse la limite.


1 commentaires

Types d'enregistrement de Ceci dans une haquetable dans le constructeur de la classe de base.



4
votes
// can be inherited only by classes in the same assembly
public abstract class A
{
    protected internal A() { }
}

// can't be inherited
public sealed class B : A
{
}

0 commentaires

1
votes

Juste pour mon édification personnelle, j'aimerais en savoir plus sur le contexte commercial qui rendent un tel choix de conception souhaitable, car mon premier thougt à la lecture du titre était "Oh, très très mauvaise idée! Une classe de base n'est jamais censé savoir quelque chose (et pire: gouverner) ses classes dérivées ".


1 commentaires

Je peux créer une union marquée de B, C et D en ayant une classe de base vide A à partir desquelles B C et D, mais pas d'autres hérités classées.