【问题标题】:Whats happening in this Self referencing inheritance code?这个自引用继承代码中发生了什么?
【发布时间】: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


    【解决方案1】:

    在这种情况下对T 的约束意味着T 必须实现AppBase&lt;T&gt; 并具有默认构造函数。实际上,您需要将自己作为类型传递。

    这通常是为了尝试解决类型系统并通过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 非常好的解释,包括为什么有人会这样做。
    • @Reed Copsey:谢谢您的回答,您已经很好地解释了代码,但我仍然对这种模式的用途感到困惑?
    • @Abhi.Net 真的,我建议避免它。通常是尝试从基类访问子类类型信息,这通常不是一个好主意...
    • @Reed Copsey:现在确实更有意义了,所以我已将您的答案标记为我接受的答案。我仍在浏览代码,看起来其他程序员正在尝试使用它来实现单例模式。此代码在我们的应用程序基类中使用,因此不能真正忽略它。
    • @Abhi.Net 这绝对不是创建单例的正确方法 - 所以我会仔细看看。
    猜你喜欢
    • 2018-11-12
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2016-06-09
    • 1970-01-01
    相关资源
    最近更新 更多