带有泛型的 C# 不寻常的继承语法

Posted

技术标签:

【中文标题】带有泛型的 C# 不寻常的继承语法【英文标题】:C# unusual inheritance syntax w/ generics 【发布时间】:2011-06-05 15:42:42 【问题描述】:

我在 NHibernate 类定义中遇到了这个问题:

public class SQLiteConfiguration : PersistenceConfiguration<SQLiteConfiguration>

所以这个类继承自一个基类,该基类由...派生类参数化?我的头刚刚爆炸。

有人能解释一下这是什么意思以及这种模式有什么用处吗?

(顺便说一句,这不是一个特定于 NHibernate 的问题。)

【问题讨论】:

这是***.com/questions/3783321/…的副本 Eric:我在我的 cmets 中向 Lambert 引用了这个 SO 问题。 我很久以前读过这个帖子,但现在才遇到这个特定的场景。我通过搜索“我的头刚刚爆炸”再次找到了该主题。哈哈。好东西是你写的,否则我可能再也找不到了。 :-) “Curiously Recurring Template Pattern”是个很无聊的名字。我在此将这种模式重新命名为“颅骨破裂模板模式”。 【参考方案1】:

That's a funny Curiously Recurring Template Pattern, isn't it?

【讨论】:

嗯。我从来没有想过我会发现自己对继承语法大笑。这是另一个有用的 SO 问题:***.com/questions/1327568/… 这是另一个很棒的讨论:***.com/questions/3783321/…。另外:fernandof.wordpress.com/2007/09/23/…【参考方案2】:

我在开发双链树时使用了相同的模式。每个节点有 1 个父节点和 0 个子节点

class Tree<T> where T : Tree<T>

    T parent;
    List<T> children;
    T Parent  get; set; 
    protected Tree(T parent) 
    
        this.parent = parent; 
        parent.children.Add(this);
    
    // lots more code handling tree list stuff

实现

class Coordinate : Tree<Coordinate>

    Coordinate(Coordinate parent) : this(parent)  
    static readonly Coordinate Root = new Coordinate(null);
    // lots more code handling coordinate systems

用法

Coordinate A = Coordinate.Root;
Coordinate B = new Coordinate(A);

B.Parent // returns a Coordinate type instead of a Node<>.

所以从Tree&lt;&gt; 继承的任何东西都将包含适当类型的父对象和子对象的属性。这个技巧对我来说是纯粹的魔法

【讨论】:

谢谢你,jalexiou,非常具体的回复!我不得不承认,我需要一段时间才能理解这一点。 @anon - 试试看!启动旧的 C# 开发并编写类似这样的代码。 @anon - 当然,它缺少构造函数、属性访问器等等。它只是骨架代码。

以上是关于带有泛型的 C# 不寻常的继承语法的主要内容,如果未能解决你的问题,请参考以下文章

带有泛型的 Typescript 箭头函数的语法是不是发生了变化?

带有泛型的 Typescript 箭头函数的语法错误

C#:泛型的语义?

Java泛型 VS C#泛型 (伪泛型 VS 真泛型)

(整理)C#基础知识_泛型的实现

《JavaSE 基础知识》泛型的基本介绍和应用。