gpt4 book ai didi

c# - 继承最派生类型的抽象类

转载 作者:太空狗 更新时间:2023-10-29 23:25:55 25 4
gpt4 key购买 nike

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

编辑: 我在以下位置找到了原始项目: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 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,它们完全相同。

谁能给我解释一下?

最佳答案

这是 C++ 中所谓的 Curiously Recurring Template Pattern 的 C# 版本。这有点奇怪,就个人而言,我尽量避免它。它很有用,但我发现它比有用更令人困惑。

详情见我的文章:

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

关于c# - 继承最派生类型的抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7480308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com