我有一个带有两个类型参数的泛型类componentDidMount
:
SomeClass
然后我有一个带有一个类型参数的通用类public class SomeClass<T, U>
where T : IFoo
where U : IBar
{
public void SomeMethod(T t) { /* ... */ }
}
。在这个课程中,我想拥有一个SomeOtherClass
的属性。对于此属性,我只想让SomeClass
的第一个类型参数与SomeClass
的类型参数匹配,而我不在乎第二个类型参数。所以我想做的是像
SomeOtherClass
但是显然不能编译。甚至可以做到吗?
答案 0 :(得分:3)
我认为唯一可行的方法是定义IBar
的实现,该实现不执行任何操作并使用它。
public class NullBar: IBar
{
// whatever no-op implementation that makes sense
}
public class SomeOtherClass<T>
where T : IFoo
{
public SomeClass<T, NullBar> Frob { get; set; }
}
答案 1 :(得分:2)
public class SomeClass<T, U>
where T : IFoo
where U : IBar
{
public void SomeMethod(T t) { /* ... */ }
}
我注意到的第一件事是,如果您不需要'U',我就不会约束U。这只会使实现变得混乱,并使事情变得更加困难。
第二点是,我认为您不能具有隐式隐含的泛型属性,但是您绝对可以使用方法来做到这一点。
public class SomeOtherClass<T>
where T : IFoo
{
public SomeClass<T, U> Frob { get; set; }
}
成为(使用抽象类忽略实现细节)
public abstract class SomeOtherClass<T>
where T : IFoo
{
public abstract SomeClass<T, U> Frob<U>(U parameter);
}
除非有歧义,否则无需指定“ U”通用参数。无论您通过什么参数作为参数,都将隐含“ U”。
如果这不符合您的需求,我想到的另一件事是通过子类默认U泛型:
public class SomeOtherClass<T, U>
where T : IFoo
where U : IBar
{
public SomeClass<T, U> Frob { get; set; }
}
public class SomeOtherClass<T> : SomeOtherClass<T, IBar>
where T : IFoo
{
}
否则,一个接口就足够了(这可能是我的建议是在此级别将其默认设置)...
public class SomeOtherClass<T>
where T : IFoo
{
public SomeClass<T, IBar> Frob { get; set; }
}