从使用派生类的泛型的类派生类

时间:2019-07-11 09:44:45

标签: c# generics inheritance

我不明白为什么此代码有效。 派生类是从使用派生类类型的基类继承的。 我期望类型创建中有无限循环之王。

请有人可以解释为什么此代码有效吗? 谢谢。

using System;
using System.Collections.Generic;
using static System.Console;

namespace ConsoleApp1
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            WriteLine(new Derived(new Internal<Derived>()));

            ReadLine();
        }
    }

    public class Base<T>
    {
        public Base(Internal<T> intern)
        {
            this.Intern = intern;
        }

        public Internal<T> Intern { get; private set; }
    }

    public class Internal<T>
    {
    }

    public class Derived : Base<Derived>
    {
        public Derived(Internal<Derived> intern)
            : base(intern)
        {
        }
    }
}

1 个答案:

答案 0 :(得分:2)

根据您的评论:

  

Derived将继承自Base<Derived>。为了创建Base<Derived>,您需要拥有Derived,因此您将继承Derived等来创建Base<Derived>。如何在{{1 }}?

您的误解从这里开始:

  

要创建Base<Derived>,您需要拥有Derived

那是不对的。您可能会认为,要创建Base<Derived>,必须首先需要一个Derived的实例。

T<U>为例。我可以创建U,而无需使用List<string>的任何实例:

List<int>

string不包含任何var list = new List<string>(); 。这只是一个空清单。同样的情况在这里适用。

要创建list,您需要一个string,您需要执行Base<Derived>Internal<Derived>也不需要通过相同的逻辑创建new Internal<Derived>()的实例。

这里真正发生的是您正在尝试创建Internal<Derived>的实例。您调用其构造函数,该构造函数以Derived的实例调用Derived的构造函数。

  

如何在Base<Derived>之前创建Internal<Derived>

考虑一下,在派生类之前创建基类是很有意义的。要创建Base<Derived>,请先创建Derived,然后向其添加所有特定于Cat的功能。