C # - Определение публичных вложенных классов: мы должны это сделать? - PullRequest
1 голос
/ 22 августа 2011

В прошлом я избегал определения вложенных классов. Но если класс только будет использоваться внутри первичного класса, то является ли вложение класса идеальным местом для него? Есть ли принятые соглашения по этому вопросу?

public class PrimaryClass
{
    public class SubClass
    {
        // ...
    }

    public SubClass MySubClass { get; set; }
    // ...
}

Или всегда должно быть

public class SubClass
{
    // ...
}

public class PrimaryClass
{
    public SubClass MySubClass { get; set; }
    // ...
}

Ответы [ 5 ]

2 голосов
/ 22 августа 2011

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

Пожалуйста, обратитесь к этому сообщению Зачем мне когда-либоИспользовать вложенные классы C #

1 голос
/ 22 августа 2011

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

Статья в Вики, сравнивающая C # и Java, имеет довольно хороший анализ, охватывающий как общие рекомендации, так и специфичные для языка проблемы.http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Java#Inner_and_local_classes

0 голосов
/ 22 августа 2011

Я склонен определять вложенные классы только как частные, а не публичные.Таким образом, вложенный класс будет использоваться только включающим классом.Только когда вложенный класс используется более чем одним классом верхнего уровня, я могу переместить класс на верхний уровень.Затем я обычно делаю его внутренним.

Использование открытых вложенных классов должно быть зарезервировано для перечислений.

0 голосов
/ 22 августа 2011

Помимо использования вложенного класса исключительно внутри внешнего класса, существуют случаи, когда вы хотите передать его экземпляры во внешний мир. Как правило, вы используете inerfaces для этого. Вот пример того, как вы можете использовать вложенные классы и интерфейс:

   public interface IDoSomething {...}

   public class Outer
   {

        public static IDoSomething GetSomethingToDo( ... parameters ...)
        { 
            if (...) return new SomethingA();
            else return new SomethingB();
        }

        private class SomethingA : IDoSomething { ...}
        private class SomethingB : IDoSomething { ...}

    }

Реализация DoSomething полностью скрыта от внешнего мира.

0 голосов
/ 22 августа 2011

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

Например, двигатель является неотъемлемой частью автомобиля. Он не может функционировать вне его (следовательно, бессмысленно), поэтому, другими словами, значимость его существования зависит исключительно от автомобиля. Я, конечно, здесь предполагаю, что двигатель не может существовать ни в чем другом, кроме как в автомобиле (не могу придумать лучшего примера, извините).

в C # вы, конечно, также можете реализовать двигатель как отдельный класс и ссылаться на него из класса транспортных средств. Это действительно выбор с вашей стороны.

...