2010-07-16 5 views
2

Je viens de lire un livre sur les modèles de programmation orientés objet. Il décrit un modèle d'usine par lequel vous pouvez faire un appel à une méthode d'usine statique d'un objet et l'objet retournera un nouvel objet de type attendu, mais il sera sous-classé de manière appropriée.Comment faire pour qu'un constructeur renvoie un objet sous-classé

Ma question, cette fonctionnalité peut-elle être fournie par un constructeur pour la classe? Si c'est le cas, comment? Je ne sais pas pourquoi? Imaginez que j'ai une classe appelée VillagePerson, qui a sous-classes PoliceOfficer, NativeAmerican, Cowboy, Biker, ConstructionWorker, et Sailor. Le constructeur prend une description de chaîne de caractères de la personne, l'analyse et retourne le type spécifique de personne que je veux. Est-ce seulement possible avec des méthodes d'usine statiques?

+0

La réponse à cette question est spécifique à la langue. – rwong

Répondre

1

C'est une paraphrase du commentaire de Steven Sudit

Créer une classe Proxy au-dessus du VillagePerson:

  • Proxy implémente la même interface que VillagePerson, mais ne possèdes pas de code de mise en œuvre à partir de cela.
  • Un proxy contient une référence _vpImpl à un objet VillagePerson sous-classé.
  • Lorsqu'une méthode est appelée sur le proxy, le proxy transmet simplement l'appel à l'objet _vpImpl.

Pour construire un sous-classé VillagePerson, le constructeur du proxy pourrait appeler le constructeur spécifique de la sous-classe, puis le stocker dans _vpImpl.

+0

Clever. On dirait beaucoup de travail pensé. – JnBrymn

+0

C'est une paraphrase du commentaire de Steven Sudit. – rwong

3

No. Habituellement, un constructeur est une fonction qui est appelée automatiquement par la langue à initialiser un objet qui est en cours de création. Cela, en soi, signifie que la fonctionnalité «appelez-moi pour créer un objet» des usines ne peut pas être fournie par un constructeur.

En outre, les constructeurs sont généralement appelés des expressions comme new ClassName(args) qui sont définies dans la plupart des langues comme la création d'une instance de ClassName et non d'une classe qui hérite de ClassName. Ainsi, vous ne pouvez pas utiliser new ou les constructeurs pour créer des instances de n'importe quel type. D'autre part, j'ai dit "dans la plupart des langues": certains, comme JavaScript, vous permettent de renvoyer ce que vous voulez d'un constructeur, et d'autres, comme Objective Caml, traitent les constructeurs comme des fonctions d'usine.

+0

+1 pour la mise en garde concernant les langues typées dynamiquement – MikeD

+3

Votre réponse est correcte, mais il existe des moyens d'approximer la saisie dynamique, même dans les langues à typage statique. Par exemple, le constructeur 'VillagePerson' peut appeler une méthode usine statique' VillagePersonImplFactory' pour initialiser son membre '_vpImpl'. Ensuite, lorsque sa méthode 'Dance' est appelée, elle peut chaîner l'appel à' _vpImpl'. Je suis sûr que le livre de modèles de conception du GoF a une étiquette officielle pour cela; Je pense à quelque chose sur les modèles. –

+0

@Steven Sudit: Oui. Je trouve cependant que l'utilisation d'une méthode d'usine est plus facile. –

Questions connexes