problème d'héritage. Comment créer plusieurs instances d'une classe de base?
-
16-10-2019 - |
Question
J'ai une classe de base (PrintProviderBase
). Il détient certains États (PrinterUnavailable
, NoPaper
, ...).
Alors je hérite de cette classe: ColorPrintProvider
, BlackAndWhitePrintProvider
...
Je suppose que si on la classe de base possède une propriété comme ceci:
private PrintStateEnum State { get; set; }
Ensuite, chaque classe enfant (différents fournisseurs d'impression) ont son propre état de (si rien est statique). Il semble une instance de la classe base
est partagée entre eux alors que je voulais dire d'avoir une copie du base class
dans chaque classe enfant si les fonctionnalités communes et de l'Etat peuvent être encapsulent en base class
.
Maintenant, si un fournisseur d'impression passe à l'état de NoPaper
, d'autres les arrêter l'impression en raison de l'état incorrect. Comment puis-je modifier ce comportement?
La solution
Dans le code affiché, l'État est un organisme privé à PrintProviderBase et ne serait pas visible pour les types dérivés comme ColorPrintProvider et ainsi de suite.
Faire état d'une propriété publique et l'utilisation Composition non héritage. Gardez un membre de PrintProvider (changer le nom de PrintProviderBase) dans ColorPrintProvider, BlackAndWhitePrintProvider et ainsi de suite.
Exemple de code:
public class PrinterState
{
public Boolean IsPaperTrayEmpty { get; set; }
public Int32 CartridgeLevel { get; set; }
}
public class ColorPrintProvider
{
public PrinterState CurrentState { get; private set; }
private void UpdateCurrentState()
{
// update the current state
// based on / after some events like RequestForPrint, PrintCompleted...
}
}
Autres conseils
Chaque instance de ColorPrintProvider et BlackAndWhitePrintProvider auront leur propre (et distincte) instance de la valeur de l'Etat, bien qu'aucun d'entre eux sera en mesure d'y accéder à moins que vous le rendre public ou protégé (ou fournir d'autres propriétés ou méthodes qui l'exposeraient ). En général, la valeur ne serait partagée entre les instances si elle était statique.