Вложенные классы .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 (это фактический язык, используемый для библиотеки).

Лол, это действительно круто. Пришлось проверить это на себе, чтобы поверить в это: p

Stormenet 19.01.2009 00:32

Ваш подход является разумным, особенно если вы хотите контролировать, кто может наследовать: сделайте базовый конструктор закрытым, и только вложенные типы могут наследовать от него. Я использую нечто подобное, когда пытаюсь смоделировать поведение enum с более богатой семантикой OO.

Jay Bazuzi 19.01.2009 00:36

напоминает мне "луна учит студента"

annakata 19.01.2009 00:39

Очевидная логическая оплошность с моей стороны. Спасибо за ответы.

Inisheer 19.01.2009 00:40

Внутренний конструктор также ограничивает тех, кто может наследовать от него ...

Rowland Shaw 19.01.2009 00:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
1 276
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

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

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

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

Это то, чего я боялся. Думаю, мне придется найти другой способ размещения моих классов. Спасибо за ответ.

Inisheer 19.01.2009 00:36
  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, который ...

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

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