首页 > 解决方案 > 从使用派生类的泛型的类派生类

问题描述

我不明白为什么这段代码有效。派生类继承自使用派生类类型的基类。我本来希望在类型创建中出现一些无限循环之王。

请有人能解释为什么这段代码有效吗?谢谢你。

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)
        {
        }
    }
}

标签: c#genericsinheritance

解决方案


从您的评论中:

Derived将继承自Base<Derived>. 为了创建Base<Derived>你需要拥有Derived,那么你将创建Derived继承Base<Derived>等。Base<Derived>之前是如何创建的Derived

你的误会从这里开始:

为了创建Base<Derived>你需要有Derived

那不是真的。您可能认为要创建T<U>必须首先需要一个实例U

List<string>个例子。我可以在List<int>不使用任何实例的情况下创建string

var list = new List<string>();

list不包含任何strings。这只是一个空列表。同样的事情也适用于这里。

要创建一个Base<Derived>,你需要一个Internal<Derived>,你通过做new Internal<Derived>()Internal<Derived>也不需要Derived由相同逻辑创建的实例。

这里真正发生的是您正在尝试创建Derived. 你调用它的构造函数,它Base<Derived>用 . 的实例调用 的构造函数Internal<Derived>

以前是怎么Base<Derived>创建的Derived

如果您考虑一下,在派生类之前创建基类是有道理的。要创建Cat,您首先创建一个Animal,然后将所有Cat- 特定功能添加到它。


推荐阅读