Вложенные типы, которые являются публичными - PullRequest
5 голосов
/ 10 марта 2010

Мне любопытно, что является хорошей практикой, когда речь идет об определенных сценариях, включающих вложенные типы в .NET.

Допустим, у вас есть класс Wheel, а класс Wheel содержит объекты Bearing. Объект Bearing имеет смысл только внутри колеса, и вы не хотите, чтобы он создавался независимо, поэтому имеет смысл иметь класс Bearing, вложенный в объект Wheel. Однако предположим, что у вас есть сценарий, в котором вам необходимо прочитать свойство Wheel.Bearings вне класса Wheel. Теперь для этого потребуется опубликовать вложенный класс Bearing.

В этой ситуации, что является лучшим вариантом?
1 - Создать общедоступный класс подшипников, вложенный в класс Wheel
2 - Создать независимый класс Bearing, который принимает объект Wheel в своем конструкторе
3 - Создайте пространство имен Wheel и создайте независимый класс Bearing внутри этого пространства имен.
4 - что-то еще?

UPDATE: Я обновляю это с более подробной информацией и отражаю некоторые предложения до сих пор. ClassParent - это родительский класс, ClassChild - это дочерний класс. ClassChild ВСЕГДА является потомком ClassParent, и не имеет смысла существовать самостоятельно. Проблема в том, что ClassChild имеет несколько свойств, которые должны быть опубликованы публично, а все остальные должны вызываться только из ClassParent. Примером является функция ClassChild.Delete, которая не должна предоставляться публично, потому что она должна вызываться только из ClassParent, поскольку ClassParent должен выполнять соответствующую очистку и модификации.

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

public class Parent
{
  ChildNested childObj

  public DeleteChild()
  {   
      //expose this method publically
      childObj.DeleteChild()
      //other functionality 
  }

  public Child GetChild()
  {
      //expose Child, not ChildNested publically
      return childObj
  }

   private class ChildNested:Child
   {
         public Child()
         {
              Base.Child()
         }
         public DeleteChild()
         {
              Base.Delete()
         }
   }

public abstract class Child
{
 protected Child()
     {
     }
 protected Delete()
     {
     }
     public PublicPropertyToExpose()
     {
     }    
}

Ответы [ 4 ]

8 голосов
/ 10 марта 2010

Лучший дизайн здесь - создать открытый класс Bearing с конструктором internal и создать его экземпляры в классе Wheel.

Если классу Bearing требуется доступ к закрытым членам класса Wheel, вы можете сделать общедоступным Bearing класс abstract, а затем сделать конкретное внедрение как вложенный класс private внутри Wheel.

В общем, вы не должны создавать public вложенных типов .

1 голос
/ 10 марта 2010

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

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

Тот факт, что вам нужна публичная собственность для подшипника, указывает на то, что он должен быть публичным классом вне Колеса.

Кроме того, что происходит, когда вы заново изобретаете Колесо (мы все делаем ...). Возможно, вы используете новый «Воздушный подшипник», например, существующий в микротурбинах, теперь у вас есть несколько типов подшипников внутри класса «Колесо», некоторые из которых не используются.

Я бы поместил Подшипник в то же пространство имен, но не в класс Колесо. Редко я нахожу потребность во внутренних классах. Обычно анонимный класс заполняет все пробелы, которые мне нужны.

1 голос
/ 10 марта 2010

Я бы хотел проверить «Подшипник» самостоятельно, поэтому я бы выбрал второй вариант.

1 голос
/ 10 марта 2010
  • Создание независимого класса подшипников с помощью частного конструктора
  • Создайте заводской класс, который будет создавать экземпляр класса Bearing с учетом класса Wheel
...