gpt4 book ai didi

c# - 这个自引用继承代码中发生了什么?

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

我有另一个程序员写的代码,我无法理解它

public abstract class AppBase<T> : IApp where T : AppBase<T>, new()
{
//
}

根据我的理解,T 类型的 AppBase 类实现了接口(interface) IApp,其中 T 实现了 ???

有人能解释一下最后一部分吗?

最佳答案

关于 T 的约束在这种情况下意味着 T必须实现 AppBase<T>并有一个默认的构造函数。实际上,您需要将自己作为类型传递。

这通常是为了尝试绕过类型系统并通过 typeof(T) 提供对基类中实现类型的访问。 .例如,给定:

public interface IApp {}

public abstract class AppBase<T> : IApp where T : AppBase<T>, new()
{
public void Print()
{
Console.WriteLine(typeof(T).ToString());
}
}

public class AppBaseFoo : AppBase<AppBaseFoo>
{
}

然后您可以编写如下代码:

var foo = new AppBaseFoo();
foo.Print();

这将打印 AppBaseFoo 的类型信息.然而,这并不是万无一失的——例如,子类化“打破”了这一点。添加:

public class AppBaseBar : AppBaseFoo {}

然后写:

var bar = new AppBaseFoo();
bar.Print();

原因相同 AppBaseFoo要打印的信息。

关于c# - 这个自引用继承代码中发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36296188/

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