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

时间:2016-03-29 22:25:13

标签: c# oop inheritance interface

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

smallestCommons([1,2]);

根据我的理解,类型findViewById(R.id.whatisyourrealid);的{​​{1}}类实现了public abstract class AppBase<T> : IApp where T : AppBase<T>, new() { // } 实现的接口AppBase ???

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

1 个答案:

答案 0 :(得分: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>
{
}

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

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

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

public class AppBaseBar : AppBaseFoo {}

然后写:

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

导致打印相同的AppBaseFoo信息。