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

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

1 голос
/ 19 января 2009

Текущая библиотека классов, над которой я работаю, будет иметь базовый класс (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 ]

4 голосов
/ 19 января 2009

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

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

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

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

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

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

При доступе к FieldA.FieldA последний FieldA доступен из-за того факта, что первый FieldA является экземпляром Field, поэтому последний FieldA фактически имеет доступ к Field.FieldA

1 голос
/ 19 января 2009

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

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

...