我有另一位程序员编写的代码,无法理解
public abstract class AppBase<T> : IApp where T : AppBase<T>, new()
{
//
}
据我了解,类型
AppBase
的T
类实现了IApp
接口(interface),其中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
信息被打印。