Вложенные типы, которые общедоступны

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

Позволяет говорят, что у Вас есть класс Колеса, и класс Колеса содержит Перенос объектов. Перенос объекта только имеет смысл в Колесе, и Вы не хотите позволять этому быть созданным независимо, таким образом, имело бы смысл вкладывать Перенос класса в объекте Колеса. Однако позволяет, говорят, что у Вас есть сценарий, где теперь необходимо считать Колесо. Свойство Bearings за пределами класса Колеса. Это теперь потребовало бы создания вложенного Переноса общественности класса.

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

ОБНОВЛЕНИЕ: я обновляю это с большим количеством деталей и отразить некоторые предложения до сих пор. ClassParent является родительским классом, ClassChild является дочерним классом. ClassChild всегда является ребенком ClassParent, не имеет смысла существовать самостоятельно. Проблема состоит в том, что ClassChild имеет несколько свойств, которые должны быть выставлены публично, в то время как все остальных нужно только назвать от ClassParent. Примером является ClassChild. Удалите функцию, которая не должна быть выставлена публично, потому что это нужно только назвать от 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()
     {
     }    
}
5
задан Justin Johnson 27 April 2010 в 16:36
поделиться

4 ответа

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

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

Как правило, не следует делать общедоступными вложенными типами .

8
ответ дан 13 December 2019 в 19:25
поделиться
  • Создать независимый подшипник класс с частным конструктором
  • Создайте фабричный класс, который будет создавать экземпляр класса Bearing, заданного классом Wheel
1
ответ дан 13 December 2019 в 19:25
поделиться

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

1
ответ дан 13 December 2019 в 19:25
поделиться

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

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

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

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

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

1
ответ дан 13 December 2019 в 19:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: