经过一些编程之后,我的一个课程以前所未有的方式使用了泛型.如果编码不好,我想对此有一些看法.
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
}
}
Run Code Online (Sandbox Code Playgroud)
这是否可以使用泛型?我主要是考虑对"本身"的约束.我有时觉得泛型可以"爆炸"到我使用Base类的其他类.
Jon*_*eet 10
是的,这是合理的 - 我在Protocol Buffers端口中有类似的东西(除了更复杂,因为有两个相互引用的类型).
你对泛型有时最终会扩展到代码库中是完全正确的 - 你在这里所做的就意味着只关心Derived拥有适当API 的代码片段不需要担心泛型.
我的建议是尽可能地保持简单,但是如果"奇怪"的通用约束确实描述了你想要的东西,那就去吧.你应该知道这并不强制有效使用 - 你可以很容易地:
class Banana : Base<Derived>
Run Code Online (Sandbox Code Playgroud)
这将是有效的,虽然奇怪,可能是用户意外.
您可能还需要考虑密封Derived- 如果您进一步得出,您可能最终会出现奇怪的行为(或者至少是一个奇怪的API).