如何控制[依赖泛型接口]的实现

本文关键字:泛型接口 依赖 实现 何控制 控制 | 更新日期: 2023-09-27 18:08:07

请先阅读第二版


假设我们有两个相互依赖的泛型接口:

interface ITemplate1<T1, T2>
    where T1 : ITemplate1<T1, T2>
    where T2 : ITemplate2<T1, T2>
{
    T2 t2 { get; set; }
}
interface ITemplate2<T1, T2>
    where T1 : ITemplate1<T1, T2>
    where T2 : ITemplate2<T1, T2>
{
    T1 t1 { get; set; }
}

并且从它们两个不同的类已经实现:

class Class1_1 : ITemplate1<Class1_1, Class2_1>
{
    public Class2_1 t2
    {
        get;
        set;
    }
}
class Class1_2 : ITemplate1<Class1_2, Class2_2>
{
    public Class2_2 t2
    {
        get;
        set;
    }
}
class Class2_1 : ITemplate2<Class1_1, Class2_1>
{
    public Class1_1 t1
    {
        get;
        set;
    }
}
class Class2_2 : ITemplate2<Class1_2, Class2_2>
{
    public Class1_2 t1
    {
        get;
        set;
    }
}

现在,我想定义一个实现ITemplate1的类,而不管它需要的类型是什么。

class MyClass<T> where T : ITemplate1< ? , ? >
{
    ...
}

. .为了防止将多个类声明为:

class MyClass1<T> where T : ITemplate1<Class1_1, Class2_1>
{
    ...
}

class MyClass2<T> where T : ITemplate1<Class1_2, Class2_2>
{
    ...
}

我怎么才能做到呢?(即真正的问题可能涉及两个以上的课程!)提前谢谢。


第1版:Class1_1,Class2_1Class1_2 &Class2_2必须一起使用。换句话说,我正在寻找一种方法:

class MyClass<T>
    where T : ITemplate1<Class1_1, Class2_1>
    or
    where T : ITemplate1<Class1_2, Class2_2>
{
    ...
}

第二版:我想我可以问得更简单一些,以免给亲爱的读者带来不便。如果我把你弄糊涂了,我很抱歉。问这样一个令人困惑的问题是因为真正的问题是完全复杂的。无论如何,下面是一个简单的形式:

标题:如何控制接口的实现?

描述:我有一个实现两个相关接口的类。我需要控制给定的类型,因为只有一些类型对彼此一致。——>第1版

如何控制[依赖泛型接口]的实现

我不知道你是否正在搜索这个,但是你可以让你的ClassX_y更通用,例如:

    class Class1_x<T2> : ITemplate1<Class1_x<T2>, T2>
        where T2 : ITemplate2<Class1_x<T2>, T2>
    {
        public T2 t2
        {
            get; set;
        }
    }
    class Class2_x<T1> : ITemplate2<T1, Class2_x<T1>>
        where T1 : ITemplate1<T1, Class2_x<T1>>
    {
        public T1 t1
        {
            get;
            set;
        }
    }

或者像这样:

class Class1_xy<T1,T2> : ITemplate1<T1,T2>
    where T2 : ITemplate2<T1,T2>
    where T1 : ITemplate1<T1,T2>
{
    public T2 t2
    {
        get; set; }
}
class Class2_xy<T1, T2> : ITemplate2<T1, T2>
    where T2 : ITemplate2<T1, T2>
    where T1 : ITemplate1<T1, T2>
{
    public T1 t1
    { get; set; }
}
class ClassBoth_xy<T1, T2> : ITemplate1<T1,T2>, ITemplate2<T1, T2>
    where T2 : ITemplate2<T1, T2>
    where T1 : ITemplate1<T1, T2>
{
    public T1 t1
    { get; set; }
    public T2 t2
    { get; set; }
}

但我不明白这到底有什么意义——也许你能给我们一些启发?

使用ClassBoth_xy<T1, T2>是一个非常好的主意,但不能限制MyClass由不正确的<T1, T2>对实现。我解决了这个问题:

class MyClass<T1, T2>
    where T1 : ITemplate1<T1, T2>, new()
    where T2 : ITemplate2<T1, T2>, new()
{
    public MyClass()
    {
        T1 _t1 = new T1();
        T2 _t2 = new T2();
        bool isValid = (_t1 is Class1_1 && _t2 is Class2_1) ||
                       (_t1 is Class1_2 && _t2 is Class2_2);
        if( !isValid )
            throw new Exception("Inconsistent types have been used to instantiate MyClass.");
    }
    ...
}