经过一些编程后,我的一个课程以前所未有的方式使用了泛型。如果编码不好,我想对此有一些看法。
abstract class Base<T> : where T : Base<T>
{
// omitted methods and properties.
virtual void CopyTo(T instance) { /*code*/ }
}
class Derived : Base<Derived>
{
override void CopyTo(Derived instance)
{
base.CopyTo(instance);
// copy remaining stuff here
}
}
这是否可以使用泛型?我主要是考虑对“本身”的约束。我有时觉得泛型可以“爆炸”到我使用Base类的其他类。
答案 0 :(得分:10)
是的,这是合理的 - 我在Protocol Buffers端口中有类似的东西(除了更复杂,因为有两个相互引用的类型)。
你对泛型有时最终会在代码库中传播是绝对正确的 - 你在这里所做的意味着只关心Derived
具有适当API的代码片段不需要担心关于泛型。
我的建议是尽可能地保持简单,但是如果“奇怪”的通用约束确实描述了你想要的东西,那就去吧。你应该知道这不会强制有效使用 - 你可以很容易地拥有:
class Banana : Base<Derived>
这将是有效的,虽然奇怪,可能是用户意外。
你可能还想考虑在这里密封Derived
- 如果你进一步得出,你可能最终会出现奇怪的行为(或者至少是奇怪的API)。