gpt4 book ai didi

c# - 奇怪的通用继承模式

转载 作者:行者123 更新时间:2023-11-30 14:08:40 25 4
gpt4 key购买 nike

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

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();
}

关于c# - 奇怪的通用继承模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34213055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com