Situación:C# OO problema de diseño con anulación de métodos
Assembly 1
________________________ ________________________
| Class A | | Class B |
|-----------------------| |-----------------------|
| Method someMethod |---------->| Method otherMethod |
| | | |
|_______________________| |_______________________|
Asamblea 1 es una aplicación que otros desarrolladores pueden utilizar. Les daremos solo el .dll para que podamos publicar actualizaciones desde la aplicación si no cambiamos la API. Los desarrolladores no pueden cambiar el marco en el ensamblaje 1
Los métodos son virtuales, por lo que los desarrolladores pueden sobrescribir los métodos para implementar su propia lógica si es necesario.
El problema es que un desarrollador no puede anular otherMethod de la clase B, , puede anularlo, pero la Clase A siempre llamará al método de la Clase B y no al método reemplazado.
Assembly 1
________________________ ________________________
| Class A | | Class B |
|-----------------------| |-----------------------|
| Method someMethod |----XX---->| Method otherMethod |
| | | |
|_______________________| |_______________________|
\ |
\ |
\ |
Assembly 2 \ |
\ ________________|_______
\ | Class ExtendedB |
\ |-----------------------|
\____________>| Method otherMethod |
| |
|_______________________|
Asamblea 2 haves una referencia al ensamblaje 1
clase parcial no funciona porque tiene que ser el mismo conjunto y no funcionará durante 2
¿Hay patrones de diseño para este problema? ¿O hay alguna otra solución con reflejo o algo así?
EDITAR añadido un ejemplo de código:
/* 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();
}
}
}
¿Cómo se llama al método en la clase B? ¿Se accede de forma estática? ¿El ensamblaje 2 (o cualquier otro ensamblaje) pasa un objeto de tipo ExtendedB a la clase A (inyección de dependencia)? – dbemerlin
¿Podría proporcionar un fragmento de código? Los diagramas no describen el * uso * muy bien. – DevinB
Gente, ¿por qué estamos sugiriendo la implementación de la interfaz antes de siquiera entender por qué la herencia no permite el polimorfismo? –