【发布时间】:2016-07-17 17:02:47
【问题描述】:
我有这个代码是由另一个程序员编写的,我无法理解它
public abstract class AppBase<T> : IApp where T : AppBase<T>, new()
{
//
}
据我了解,T 类型的AppBase 类实现了IApp 接口,其中T 实现了???
有人可以解释最后一部分吗?
【问题讨论】:
标签: c# oop inheritance interface
我有这个代码是由另一个程序员编写的,我无法理解它
public abstract class AppBase<T> : IApp where T : AppBase<T>, new()
{
//
}
据我了解,T 类型的AppBase 类实现了IApp 接口,其中T 实现了???
有人可以解释最后一部分吗?
【问题讨论】:
标签: c# oop inheritance interface
在这种情况下对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 信息。
【讨论】:
T 是抽象AppBase 的具体类型”。 +1 非常好的解释,包括为什么有人会这样做。