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

Текущая библиотека классов, над которой я работаю, будет иметь базовый класс (Field) с более чем 50 конкретными типами «полей», которые будут наследоваться от «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();
    }
}

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

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

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


person Inisheer    schedule 18.01.2009    source источник
comment
Лол, это реально круто. Пришлось проверить это самому, чтобы поверить в это :p   -  person Stormenet    schedule 19.01.2009
comment
Ваш подход является разумным, особенно если вы хотите контролировать, кто может наследовать: сделайте базовый конструктор закрытым, и только вложенные типы могут наследовать от него. Я использую что-то подобное, когда пытаюсь смоделировать поведение enum с более богатой семантикой объектно-ориентированного программирования.   -  person Jay Bazuzi    schedule 19.01.2009
comment
напоминает мне о луне инструктирует студента   -  person annakata    schedule 19.01.2009
comment
Явная логическая оплошность с моей стороны. Спасибо за ответы.   -  person Inisheer    schedule 19.01.2009
comment
Внутренний конструктор также ограничит тех, кто может наследовать от него...   -  person Rowland Shaw    schedule 19.01.2009


Ответы (3)


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

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

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

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

person Rowland Shaw    schedule 18.01.2009
comment
Вот чего я боялся, происходит. Я думаю, мне придется найти другой способ вложения моих классов. Спасибо за ответ. - person Inisheer; 19.01.2009

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

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

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

person chakrit    schedule 18.01.2009

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

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

person annakata    schedule 18.01.2009