Вывод класса из класса, который использует универсальный производного класса - PullRequest
1 голос
/ 11 июля 2019

Я не понимаю, почему этот код работает.Производный класс наследуется от Базового класса, который использует тип Производного класса.Я бы ожидал какого-то короля бесконечного цикла при создании типов.

Пожалуйста, кто-нибудь может объяснить, почему этот код работает?Спасибо.

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 Ответ

2 голосов
/ 11 июля 2019

Из вашего комментария:

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 не содержит string s.Это просто пустой список.То же самое применимо и здесь.

Чтобы создать Base<Derived>, вам нужен Internal<Derived>, который вы получите, выполнив new Internal<Derived>().Internal<Derived> также не требует, чтобы экземпляр Derived создавался по той же логике.

В действительности здесь происходит попытка создать экземпляр Derived.Вы вызываете его конструктор, который вызывает конструктор Base<Derived> с экземпляром Internal<Derived>.

Как создается Base<Derived> до Derived?

Если вы подумаете об этом, имеет смысл создать базовые классы перед производными классами.Чтобы создать Cat, вы сначала создаете Animal, а затем добавляете в него все * Cat -специфические функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...