我一直在尝试在C#中找到泛型使用模式的名称,而且我不知道比堆栈溢出更好的资源!
我正在做的是创建直接传递派生类的通用基类 - 我查看并查找了这个或模式名称的示例,我希望这个社区的一个伟大成员能够帮助我。
我在http://www.mobiusbay.com/home/alittlesomethingimcallingcascadinggenerics写了一篇关于它是如何工作的文章,但是如果你不想在那里阅读,那么就会有一个例子:
public abstract class IndexedMemberBase<TDerivedClass> : IDisposable where
TDerivedClass : IndexedMemberBase<TDerivedClass>
{
#region Declarations & Properties
private static List<TDerivedClass> derivedInstances = new List<TDerivedClass>();
public static List<TDerivedClass> DerivedInstances
{
get { return derivedInstances; }
}
#endregion
#region Constructor(s)
public IndexedMemberBase()
{
if (derivedInstances == null) derivedInstances = new List<TDerivedClass>();
derivedInstances.Add((TDerivedClass)this);
}
#endregion
#region Methods
public void Dispose()
{
if (derivedInstances.Contains(this) == true)
{
derivedInstances.Remove((TDerivedClass)this);
}
}
#endregion
}
这是基类,派生类可以非常简单 - 例如:
public class IndexMember : IndexedMemberBase<IndexMember>
{
//Add all the crazy business you could ever want!
}
这段代码将指向dervied类的每个实例的指针抛出到静态集合中以供一般使用 - 该集合对于每个派生类都是不同的,因此您不会在基础中静态存在冲突。我发现它在我的项目中非常有用,我希望其他人可以找到它。
需要指出的重要一点是派生类将自己的通用签名传递给基类。
如果有人看到这种模式在使用中,或者知道它的名称 - 我真的很想看到一些例子,或者至少用它的正确名称来称呼它!现在,我称之为递归泛型,因为它似乎很合适,但我确信有一个更好的名字!
亚当
答案 0 :(得分:4)
它被称为Curiously Recurring Template Pattern
(由于某种原因,它在SO上才非常出名?)
答案 1 :(得分:4)
Eric Lippert在his blog撰写了这篇文章。
它被称为奇怪的重复模板模式,虽然它指的是C ++,它们是模板而不是泛型。