Задача такая:
1. Есть ряд базовых операций, которые реализованы как extensions для интерфейсов ISimpleInterfaceXXX
2. Нужно уметь плодить различные классы, которые наследуют соответствующие интерфейсы и используют их в своей логике.
3. С использованием ISimpleInterfaceXXX проблем нет.
4. Вопрос: как лучше реализовывать новые extensions, которые требуют наличия уже нескольких реализованных ISimpleInterfaceXXX?
На данный момент это сделано так, как в примере ниже: IComplexInterface + IComplexInterfaceExtensions + GetSimpleInterfaceXXX + InitializeGuard в каждом extension.
Еще варианты?
interface ISimpleInterfaceFirst
{
/* Mandatory members */
}
static class ISimpleInterfaceFirstExtensions
{}
interface ISimpleInterfaceSecond
{
/* Mandatory members */
}
static class ISimpleInterfaceSecondExtensions
{}
interface IComplexInterface
{
/* Mandatory members */
}
static class IComplexInterfaceExtensions
{
private static void InitializeGuard(this IComplexInterface s)
{
if (!(s is ISimpleInterfaceFirst && s is ISimpleInterfaceSecond))
throw new Exception("Bad usage");
}
private static ISimpleInterfaceFirst GetSimpleInterfaceFirst(this IComplexInterface s)
{
return s as ISimpleInterfaceFirst;
}
private static ISimpleInterfaceSecond GetSimpleInterfaceSecond(this IComplexInterface s)
{
return s as ISimpleInterfaceSecond;
}
public static void ExtensionMethod(this IComplexInterface s)
{
s.InitializeGuard();
//Logic using ISimpleInterfaceFirst and ISimpleInterfaceSecond via GetSimpleInterfaceFirst and GetSimpleInterfaceSecond
}
}
//Делаем доступными операции из обоих интерфейсов
class SimpleLogic: ISimpleInterfaceFirst, ISimpleInterfaceSecond
{}
//Делаем доступными операции из обоих интерфейсов + операции, требующий реализацию обоих интерфейсов
class ComplexLogic: ISimpleInterfaceFirst, ISimpleInterfaceSecond, IComplexInterface
{}