在一些研究中,我遇到了使用以前从未见过的泛型的继承模式。

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>
{
    //...
}


用法:

static void Main(string[] args)
{
    DerivedClass derivedReference = new DerivedClass();

    //this looks odd...
    BaseClass<DerivedClass> baseReference = derivedReference;

    //this doesn't work
    //BaseClass baseClass = derivedReference;

}


令我惊讶的是,这甚至奏效了,我必须自己进行测试。我仍然不明白您为什么要这样做。

我唯一能想到的就是防止将不同的派生类作为基类一起存储在集合中。这可能是原因,我想我对应用程序很好奇。

最佳答案

它称为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;
    }
}


用法:

static void Main(string[] args)
{
    DerivedClass derivedReference = new DerivedClass();

    DerivedClass clone = derivedReference.Clone();
}

10-08 04:48