Ситуация:C# OO дизайн проблема с отключением от методов
Assembly 1
________________________ ________________________
| Class A | | Class B |
|-----------------------| |-----------------------|
| Method someMethod |---------->| Method otherMethod |
| | | |
|_______________________| |_______________________|
Ассамблеи 1 представляет собой приложение, которое другие разработчики могут использовать. Мы дадим им только DLL, чтобы мы могли публиковать обновления из приложения, если мы не изменим api. Разработчики не могут изменить структуру в сборке 1
Методы являются виртуальными, поэтому разработчики могут переопределять методы для реализации там собственной логики, если это необходимо.
Проблема заключается в том, что разработчик не может переопределить otherMethod из класса B, , он может переопределить его, но класс A всегда будет вызывать метод из класса B, а не переопределенный метод.
Assembly 1
________________________ ________________________
| Class A | | Class B |
|-----------------------| |-----------------------|
| Method someMethod |----XX---->| Method otherMethod |
| | | |
|_______________________| |_______________________|
\ |
\ |
\ |
Assembly 2 \ |
\ ________________|_______
\ | Class ExtendedB |
\ |-----------------------|
\____________>| Method otherMethod |
| |
|_______________________|
Ассамблея 2 имущие ссылку на сборку 1
Частичный класс не работает, потому что она должна быть такой же, монтаж и не будет работать над 2
Существуют шаблоны проектирования для этой проблемы? Или есть другое решение с отражением или что-то в этом роде?
EDIT Добавлен пример кода:
/* 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();
}
}
}
Как вы называете метод класса B? Доступен ли он статически? Составляет ли сборка 2 (или любая другая сборка) объект типа ExtendedB в класс A (инъекция зависимостей)? – dbemerlin
Не могли бы вы предоставить фрагмент кода? Диаграммы не очень хорошо описывают * использование *. – DevinB
Люди, почему мы предлагаем реализацию интерфейса, прежде чем мы поймем, почему наследование не позволяет полиморфизм? –