Мне любопытно, что является хорошей практикой, когда речь идет об определенных сценариях, включающих вложенные типы в .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()
{
}
}