继承最派生类型的抽象类

时间:2011-09-20 04:53:52

标签: c# inheritance c#-4.0

不幸的是,我找不到导致我这个问题的原始项目。这可能会给这个问题带来更多的背景。

编辑:我在http://mews.codeplex.com/SourceControl/changeset/view/63120#1054567找到了原始项目,其具体实现位于:http://mews.codeplex.com/SourceControl/changeset/view/63120#1054606

让我们说我有一个抽象类,其具有一些有用的实现,如:

abstract class AbstractClass
{
    public virtual int ConvertNumber(string number)
    {
        string preparedNumber = Prepare(number);
        int result = StringToInt32(number);
        return result;
    }

    protected abstract string Prepare(string number);

    protected virtual int StringToInt32(string number)
    {
        return Convert.ToInt32(number);
    }
}

sealed class ConcreteClass : AbstractClass
{
    protected override string Prepare(string number)
    {
        return number.Trim();
    }

    public override int ConvertNumber(string number)
    {
        return base.ConvertNumber(number);
    }
}

这是基本的。现在在我在网上看到的代码中,作者通过从最派生类型继承Abstract类来实现继承,例如:

abstract class AbstractGenericClass<TGenericClass>
    where TGenericClass : AbstractGenericClass<TGenericClass>
{
    public virtual int ConvertNumber(string number)
    {
        string preparedNumber = Prepare(number);
        int result = StringToInt32(number);
        return result;
    }

    protected abstract string Prepare(string number);

    protected int StringToInt32(string number)
    {
        return Convert.ToInt32(number);
    }
}

sealed class ConcreteGenericClass : AbstractGenericClass<ConcreteGenericClass>
{
    protected override string Prepare(string number)
    {
        return number.Trim();
    }

    public override int ConvertNumber(string number)
    {
        return base.ConvertNumber(number);
    }
}

现在为什么会做这样的事情?我非常隐约地记得这是ATL出于性能原因大量使用的一种技术(某种方式调用具体的成员实现而不使用vtable?)我不太确定这部分。

我检查了两种情况下生成的IL,它们完全一样。

谁可以向我解释这个?

1 个答案:

答案 0 :(得分:4)

这是C ++中所谓的奇怪重复模板模式的C#版本。这有点奇怪,而且我个人试图避免它。这很有用,但我发现它比有用更令人困惑。

有关详细信息,请参阅我的文章:

http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx