在这个自我引用继承代码中发生了什么?

Abh*_*Net 8 c# oop inheritance interface

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

public abstract class AppBase<T> : IApp where T : AppBase<T>, new()
{
    //
}
Run Code Online (Sandbox Code Playgroud)

从我的理解的AppBase类类型T实现的接口IApp,其中T实现???

有人可以解释最后一部分吗?

Ree*_*sey 7

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>
{
}
Run Code Online (Sandbox Code Playgroud)

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

var foo = new AppBaseFoo();
foo.Print();
Run Code Online (Sandbox Code Playgroud)

这将打印类型信息AppBaseFoo.但是,这不是万无一失的 - 例如,子类化"打破"这个.添加:

public class AppBaseBar : AppBaseFoo {}
Run Code Online (Sandbox Code Playgroud)

然后写:

var bar = new AppBaseFoo();
bar.Print();
Run Code Online (Sandbox Code Playgroud)

导致AppBaseFoo打印相同的信息.