2010-06-09 5 views
3

J'ai un site Web .NET écrit en C# et je vais créer des fonctionnalités que d'autres développeurs peuvent utiliser. Je vais donc faire une implémentation par défaut et un développeur peut remplacer certaines méthodesProblèmes avec les classes étendues et écrasement avec les méthodes

Exemple: j'ai une classe ShoppingCart et une classe Product le produit de la classe nantis d'une méthode getProductPrice le shoppingcart appellera la méthode getProductPrice pour le calcul du total prix du panier

le ShoppingCart et Product sont dans le même projet et je vais donner les développeurs le .dll afin qu'ils ne peuvent pas changer le code source afin que nous puissions mettre à jour l'ensemble plus tard

ils ont donc besoin de faire un autre projet et étendre la classe de produits et remplacer la méthode getProductPrice afin qu'ils peuvent mettre en œuvre leur propre logique Le problème est que le shoppingcart va pas appeler la méthode étendue, mais l'original

Si nous faisons déjà un projet étendu pour les développeurs et le shoppingcart appellera la méthode étendue alors nous avons une référence circulaire parce que le produit étendu a besoin d'une référence au produit et le panier d'achat au produit étendu

Les classes partielles ne fonctionnent pas aussi parce que nous ne pouvons utiliser que des partiels dans le même assemblage

Est-ce que quelqu'un a une suggestion?

Merci d'avance.

+0

Le terme est "override", pas "overwrite" – dthorpe

+0

l'une des réponses a-t-elle aidé du tout? Avez-vous besoin d'aide supplémentaire? – GenericTypeTea

Répondre

2

Vous devez marquer tous vos Product méthodes comme virtual:

public virtual decimal GetProductPrice() { }; 

Ensuite, les développeurs qui prendront le relais peuvent ensuite hériter du produit et remplacer la méthode:

public class OverriddenProduct : Product 
{ 
    public override decimal GetProductPrice() { } 
} 

Parce que OverridenProduct (en mon exemple ci-dessus) hérite de Product, il peut toujours être ajouté dans la collection Product au sein de votre classe ShoppingCart.

Juste des symantics Je suppose, mais la méthode de la classe ShoppingCart devrait probablement être GetTotalPrice() pas GetProductPrice() car je suppose que vous obtenez le coût total des produits dans le panier.

+0

Essayer de l'implémenter, changer une logique et des classes mais je pense que c'est une solution – Marco

0

Déclarez votre méthode en tant que méthode virtuelle. Cela vous permet de le surcharger dans une classe héritière afin que tous les appels qui lui sont adressés soient toujours routés vers l'implémentation prioritaire. More about virtual methods.

En outre, GetProductPrice ressemble à quelque chose qui pourrait être préférable de mettre en œuvre en tant que propriété au lieu d'une méthode.

Questions connexes