2010-03-10 2 views
5

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

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

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

ОБНОВЛЕНИЕ: Я обновляю это с более подробной информацией и покажу некоторые из предложений. 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() 
    { 
    }  
} 

ответ

8

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

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

В общем, you should not make public nested types.

+0

+1. Я абсолютно согласен. Вложенные типы трудно читать, их трудно соблюдать. Когда вы программируете против них, вам всегда нужно указывать тип вывода, который довольно раздражает. – Steven

+0

Но что, если сценарий заключался в том, что Подшипник никогда не может и никогда не должен существовать без Колеса? Потому что в этом случае вы можете создать объект Bearing без колеса. Примером является класс Keyboard и класс Key, у вас никогда не может быть ключевой ключ без клавиатуры. –

+0

Есть ли способ создать класс, который имеет два (или более) общедоступных класса, полученных из него, но не является «публично» выводимым, за исключением того, что он имеет открытый класс public, с частным конструктором, а затем имеет производные классы вложен в нее? При разработке иерархии классов я часто оказываюсь в коробке в углу, где вещи, которые я хочу быть публичными, застряли внутри других классов. Какой-нибудь хороший способ обойти это, кроме того, что мне нужно больше возможностей, чем я этого действительно хочу? – supercat

1
  • Создать независимый класс подшипника с частным конструктору
  • Созданием класса фабрики, который будет создать экземпляр класса подшипников данного класса колеса
+0

Как вариант, на колесе, который возвращает подшипник, скажем, «CreateBearing». –

1

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

1

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

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

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

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

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

Смежные вопросы