C#Generics - 试图找到模式的名称

时间:2011-05-07 18:39:48

标签: c# .net generics abstraction

我一直在尝试在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类的每个实例的指针抛出到静态集合中以供一般使用 - 该集合对于每个派生类都是不同的,因此您不会在基础中静态存在冲突。我发现它在我的项目中非常有用,我希望其他人可以找到它。

需要指出的重要一点是派生类将自己的通用签名传递给基类。

如果有人看到这种模式在使用中,或者知道它的名称 - 我真的很想看到一些例子,或者至少用它的正确名称来称呼它!现在,我称之为递归泛型,因为它似乎很合适,但我确信有一个更好的名字!

非常感谢你的帮助!

亚当

2 个答案:

答案 0 :(得分:4)

它被称为Curiously Recurring Template Pattern

(由于某种原因,它在SO上才非常出名?)

答案 1 :(得分:4)

Eric Lippert在his blog撰写了这篇文章。

它被称为奇怪的重复模板模式,虽然它指的是C ++,它们是模板而不是泛型