Мне любопытно, что такое хорошая практика, когда дело доходит до определенных сценариев, связанных с вложенными типами в .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()
{
}
}
+1. Я абсолютно согласен. Вложенные типы трудно читать, их трудно соблюдать. Когда вы программируете против них, вам всегда нужно указывать тип вывода, который довольно раздражает. – Steven
Но что, если сценарий заключался в том, что Подшипник никогда не может и никогда не должен существовать без Колеса? Потому что в этом случае вы можете создать объект Bearing без колеса. Примером является класс Keyboard и класс Key, у вас никогда не может быть ключевой ключ без клавиатуры. –
Есть ли способ создать класс, который имеет два (или более) общедоступных класса, полученных из него, но не является «публично» выводимым, за исключением того, что он имеет открытый класс public, с частным конструктором, а затем имеет производные классы вложен в нее? При разработке иерархии классов я часто оказываюсь в коробке в углу, где вещи, которые я хочу быть публичными, застряли внутри других классов. Какой-нибудь хороший способ обойти это, кроме того, что мне нужно больше возможностей, чем я этого действительно хочу? – supercat