在一些研究过程中,我遇到了一种使用我以前从未见过的泛型的继承模式。
http://thwadi.blogspot.ca/2013/07/using-protobuff-net-with-inheritance.html http://thwadi.blogspot.ca/2013/07/using-protobuff-net-with-inheritance.html
public abstract class BaseClass<TClass> where TClass : BaseClass<TClass>
{
//...
}
public class DerivedClass : BaseClass<DerivedClass>
{
//...
}
Usage:
static void Main(string[] args)
{
DerivedClass derivedReference = new DerivedClass();
//this looks odd...
BaseClass<DerivedClass> baseReference = derivedReference;
//this doesn't work
//BaseClass baseClass = derivedReference;
}
我很惊讶这竟然有效,我必须自己测试一下。我还是不明白你为什么要这样做。
我唯一能想到的就是防止不同的派生类作为它们的基类一起存储在集合中。这可能是原因,我想我只是对应用程序感到好奇。
它被称为奇怪的重复模板模式 https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern它通常用于允许类中的方法使用派生类的类型作为传入或返回的参数。
例如,这是实现的 Clone 方法,因此只有每一层都需要在沿着链向下传递时将其自己的属性添加到该方法中。
public abstract class BaseClass<TClass> where TClass : BaseClass<TClass>, new()
{
public int Foo {get;set;}
public virtual TClass Clone()
{
var clone = new TClass();
clone.Foo = this.Foo;
return clone;
}
}
public class DerivedClass : BaseClass<DerivedClass>
{
public int Bar {get;set;}
public override DerivedClass Clone()
{
var clone = base.Clone();
clone.Bar = this.Bar;
return clone;
}
}
Usage:
static void Main(string[] args)
{
DerivedClass derivedReference = new DerivedClass();
DerivedClass clone = derivedReference.Clone();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)