Situation:C# problème de conception OO avec priorité des méthodes
Assembly 1
________________________ ________________________
| Class A | | Class B |
|-----------------------| |-----------------------|
| Method someMethod |---------->| Method otherMethod |
| | | |
|_______________________| |_______________________|
Assemblée 1 est une application que d'autres développeurs peuvent utiliser. Nous leur donnerons seulement le .dll afin que nous puissions publier des mises à jour de l'application si nous ne changeons pas l'API. Les développeurs ne peuvent pas modifier le framework dans l'assembly 1
Les méthodes sont virtuelles afin que les développeurs puissent remplacer les méthodes pour implémenter leur propre logique si nécessaire. Le problème est qu'un développeur ne peut pas remplacer otherMethod de la classe B, il peut le remplacer, mais la classe A appellera toujours la méthode de la classe B et non la méthode surchargée.
Assembly 1
________________________ ________________________
| Class A | | Class B |
|-----------------------| |-----------------------|
| Method someMethod |----XX---->| Method otherMethod |
| | | |
|_______________________| |_______________________|
\ |
\ |
\ |
Assembly 2 \ |
\ ________________|_______
\ | Class ExtendedB |
\ |-----------------------|
\____________>| Method otherMethod |
| |
|_______________________|
Assemblée 2 nantis d'une référence à l'assemblage 1
classe partielle ne fonctionne pas car il doit être le même ensemble et ne fonctionnera pas plus de 2
Y at-il des modèles de conception pour ce problème? Ou existe-t-il une autre solution avec réflexion ou autre chose?
EDIT Ajout d'un exemple de code:
/* ASSEMBLY 1 */
namespace Assembly1
{
public interface IAService
{
void TestMethod3();
void TestMethod4();
}
public interface IBService
{
void TestMethod1();
void TestMethod2();
}
public class AService : IAService
{
// Base implementation of AService
public virtual void TestMethod3()
{
//do something
}
public virtual void TestMethod4()
{
//do something
}
}
public class BService : IBService
{
// Base implementation of BService
public virtual void TestMethod1()
{
//do something
}
public virtual void TestMethod2()
{
//need to call AService implementation from assembly 2
}
}
}
/* ASSEMBLY 2 */
namespace Assembly2
{
public class NewAService : AService
{
public override void TestMethod3()
{
//default implementation which could be overridden
base.TestMethod3();
}
public override void TestMethod4()
{
//default implementation which could be overridden
//An implementation of IBService Should be called
base.TestMethod4();
}
}
}
Comment appelez-vous la méthode sur la classe B? Est-ce que l'accès est statique? Est-ce que Assembly 2 (ou tout autre assemblage) passe un objet de type ExtendedB à la classe A (injection de dépendance)? – dbemerlin
Pourriez-vous fournir un extrait de code? Les diagrammes ne décrivent pas très bien l'utilisation. – DevinB
Les gens, pourquoi proposons-nous une implémentation d'interface avant même de comprendre pourquoi l'héritage n'autorise pas le polymorphisme? –