Вложенные классы.NET

Текущая библиотека классов, над которой я работаю, будет иметь базовый класс (Field) с более чем 50 конкретными типами "field", которые будут наследоваться от "Field" и вложены для обеспечения читабельности. Например...

abstract class Field
{
    public int Length { get; set; }

    public class FieldA : Field
    {
        public static void DoSomething()
        {
            Console.WriteLine("Did something.");
        }
    }
}

Пока все выглядит хорошо, и я могу использовать код, как показано:

class Program
{
    static void Main(string[] args)
    {
        Field.FieldA.DoSomething();
    }
}

Однако почему это работает? Что здесь происходит, что позволяет intellisense компилятора / IDE продолжать связывать эти "FieldA"?

class Program
{
    static void Main(string[] args)
    {
        Field.FieldA.FieldA.FieldA.FieldA.FieldA.FieldA.FieldA.DoSomething();
    }
}

Это ни в коем случае не нарушение приложений, но я подумал, что это было странно. Делает то же самое в Boo (это фактический язык, используемый для библиотеки).

3 ответа

Решение

Похоже, вы хотели что-то вроде:

abstract class Field
{
    public int Length { get; set; }
}

public class FieldA : Field
{
    public static void DoSomething()
    {
        Console.WriteLine("Did something.");
    }
}

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

  1. Field имеет публичный вложенный класс с именем FieldA
  2. FieldA наследуется от Field
  3. Таким образом, вы всегда можете получить доступ FieldA от FieldA,

Ссылка не создает бесконечные цепочки, она просто указывает на один и тот же класс. ( некоторый тестовый код)

Когда вы получаете доступ FieldA.FieldA, последний FieldA доступен благодаря тому, что бывший FieldA это пример Field так что последний FieldA на самом деле доступ Field.FieldA

FieldA наследует ссылку на класс FieldA, который наследует ссылку на класс FieldA, который наследует ссылку на класс FieldA, который наследует ссылку на класс FieldA, который наследует ссылку на класс FieldA, который наследует ссылку на класс FieldA, который наследует ссылку на класс FieldA, который...

Это работает, потому что это то, что вы сказали, чтобы сделать.

Другие вопросы по тегам