不幸的是,我找不到导致我这个问题的原始项目。这可能会给这个问题带来更多的背景。
编辑:我在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,它们完全一样。
谁可以向我解释这个?
答案 0 :(得分:4)
这是C ++中所谓的奇怪重复模板模式的C#版本。这有点奇怪,而且我个人试图避免它。这很有用,但我发现它比有用更令人困惑。
有关详细信息,请参阅我的文章:
http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx