处理多个嵌套接口

时间:2017-07-20 00:51:43

标签: c# inheritance

我有一组嵌套类,如下所示:

class A_Class
{
     ...
}

class B_Class
{
    ...
    List<A_Class> A_List
}
class C_Class
{
    ...
    List<B_Class> B_List
    B_Class Selected_B
}
class D_Class
{
    ...
    List<C_Class> C_List
}

这些包含一些非常复杂的lambda逻辑,但每个类只需要少量输入和输出。我现在需要这个对象的不同实现,没有所有复杂的逻辑,只有字段,所以可以设置预期的输出。

但是我也有一些方法可以读取上述类的输出,这些方法也需要能够从新的实现中读取。

所以我的接口如下:

interface A_Interface
{
     ...
}

interface B_Interface
{
    ...
    List<A_Interface> A_List
}
interface C_Interface
{
    ...
    List<B_Interface> B_List
    B_Interface Selected_B
}
interface D_Interface
{
    ...
    List<C_Interface> C_List
}

并在类之上进行更改以实现这些接口

class A_Class : A_Interface
{
     ...
}

class B_Class : B_Interface
{
    ...
    List<A_Class> A_List
}
class C_Class : C_Interface
{
    ...
    List<B_Class> B_List
    B_Class Selected_B
}
class D_Class : D_Interface
{
    ...
    List<C_Class> C_List
}

这给出了返回类型的问题,遗憾的是,这些类的原始开发人员具有彼此耦合的类的实现,我不能将例如List<B_Class> B_List更改为List<B_Interface> B_List而不暴露在该接口中大量特定于原始实现的字段。

我尝试过使用泛型的解决方案:

interface Interface_D<Type_C, Type_B, Type_A> where Type_C : Interface_C<Type_B, Type_A> where Type_B : Interface_B<TypeA> where TypeA : Interface_A
{
    List<Type_C> C_List
}
interface Interface_C<Type_B, Type_A> where Type_B : Interface_B<TypeA> where TypeA : Interface_A
{
    List<Type_B> B_List
    Type_B Selected_B
}
interface Interface_B<Type_A> where Type_A : Interface_A
{
    List<Type_A> A_List
}

class A_Class : Interface_A {...}
class B_Class : Interface_B<A_Class> {...}
class C_Class : Interface_C<B_Class,A_Class> {...}
class A_Class : Interface_D<C_Class,B_Class,A_Class> {...}

这可以让我编译。但是当消耗顶级类(D_Class)时,我必须声明它:

Interface_D<Interface_C<Interface_B<Interface_A>, Interface_A>, Interface_B<Interface_A>, Interface_A> Obj;

我可以使用另一个扩展这些乱码/类型的接口来解决这个问题。

Interface_DBase : Interface_D<Interface_C<Interface_B<Interface_A>, Interface_A>, Interface_B<Interface_A>, Interface_A>

但是我仍然无法将D_Class<C_Class,B_Class,A_Class>(现有实现)的实例强制转换为Interface_DBase以便使用它。

那么有没有办法做这个演员?或者甚至更好地避免在接口中完全拥有所有这些嵌套类型参数?我希望我的手上有一个XY问题,并且有一个正确的方法来实现这个我没有偶然发现。

0 个答案:

没有答案