2009-03-18 7 views
0

J'ai une classe Request.csQu'est-ce que c'est? Méthode de modèle ou quoi?

Il a une méthode abstraite:

public abstract Response CreateResponse(XmlReader reader); 

et il y a aussi une méthode:

public Response SendRequest(string requestURI) 
{ 
    ... 

    XmlReader reader = XmlReader.Create(responseStream); 

    return CreateResponse(reader); 
} 

Le CreateResponse method est mis en œuvre dans une sous-classe qui étend Request. Et cette implémentation renvoie une réponse.

Je ne comprends pas comment vous pouvez retourner une méthode comme celle-ci qui est une méthode abstraite mais la valeur retournée est réellement dans l'implémentation de la méthode de la sous-classe. Est-ce un exemple du Template Method pattern ou simplement du polymorphisme simple, ou est ce code "rusé ou trop astucieux" ou même désordonné? J'essaie de comprendre comment cela peut même être fait (est ce principe de base OOP ou modèle de conception) et est-ce une bonne pratique ou une bonne utilisation de la POO?

Répondre

1

Oui, il s'agit d'une méthode de modèle. La classe Response étant abstraite, vous devez implémenter CreateResponse avant de pouvoir appeler SendRequest. De cette façon, la logique commune est encapsulée dans la classe de base et le reste de la logique peut varier selon les besoins (en créant plusieurs implémentations de la classe de base).

+0

Merci d'avoir confirmé cela pour moi. Jamais utilisé une méthode de modèle avant. – user72603

1

Il s'agit d'une approche très standard. En fait, c'est souvent recommandé. La méthode CreateResponse est comme un blanc qui doit être rempli par la classe dérivée.

+0

Merci, je n'étais juste pas sûr ... jamais vu cela avant. – user72603

+0

donc ce n'est pas un modèle de méthode de modèle ou est-ce un peu? – user72603

+0

Il est plus simple de considérer cela comme une autre forme de paramétrage - en donnant un nom à un «écart» qui doit être rempli pour utiliser quelque chose; essentiellement la même idée qu'une fonction prenant des paramètres, ou un générique prenant des paramètres de type, et ainsi de suite. –

0

La raison principale étant que lorsque vous utilisez la méthode, vous ne connaissez jamais les détails, seule l'interface et une méthode abstraite l'ont définie.

Etre comme la méthode est abstraite, elle n'a pas de détails car ils doivent être définis par la classe dérivée. Le point principal qui rend cela possible est que les "IN" et les "OUT" ne changent jamais car la méthode EST abstraite dans la base donc l'interface est définie, mais pas l'implémentation ... pour le moment. Pensez-y comme si quelqu'un vendait des billets d'avion de base du point A au point B sans savoir quelle compagnie aérienne allait être utilisée. Ils n'ont aucune idée de la façon dont vous y arriverez, mais une fois qu'ils auront passé le contrat du billet vendu à une compagnie aérienne, cette compagnie aérienne déterminera les modalités d'exécution des contrats. Tout ce que vous inquiétiez lors de l'achat du billet que vous saviez pour x dollars que vous allez obtenir de A à B.

0

Cette méthode est de modèle, et la méthode de modèle est vraiment pas beaucoup plus que le polymorphisme simple. C'est exactement le genre de chose que le polymorphisme typique de C#/Java-style OO est destiné et c'est un bon usage du langage.

Questions connexes