Фон: Я включил (порождают) класс E с вложенным классом N с несколькими экземплярами N в E. Во вложенном (родительском) классе я делаю некоторые вычисления, и я устанавливаю значения для каждого экземпляра вложенного класса. Что-то вроде этого:
n1.field1 = ...;
n1.field2 = ...;
n1.field3 = ...;
n2.field1 = ...;
...
Это - один большой метод оценки (в родительском классе). Мое намерение - так как все вычисления находятся в родительском классе (они не могут быть сделаны на вложенный экземпляр, потому что это сделало бы код более сложным) - делают методы set только доступными общественности методов считывания и родительскому классу.
И теперь существует проблема:
Я застреваю - как сделать это (предельный доступ до родительского класса, ни больше, ни меньше)?
Я подозреваю, что получу вопрос ответа сначала - "но почему Вы не разделяете оценку на каждое поле" - таким образом, я отвечаю на это примером: как Вы вычисляете минуту и макс. значение набора? Быстрым способом? Ответ - в одной передаче. Поэтому у меня есть одна функция оценки, которая делает вычисления и устанавливает все поля сразу.
Если у вас есть возможность поместить родительский и дочерний классы в другую сборку, вы можете использовать internal
для установщиков. Обычно так поступают в дикой природе.
РЕДАКТИРОВАТЬ :
Ответ Томаса Левеска дал мне идею:
class Program
{
static void Main(string[] args)
{
E myE = new E();
Console.WriteLine("E.N1.Field1 = " + myE.N1.Field1);
Console.WriteLine("E.N2.Field1 = " + myE.N2.Field1);
}
public interface IN
{
int Field1 { get; }
}
public class E
{
private N _n1 = new N();
private N _n2 = new N();
public E()
{
_n1.Field1 = 42;
_n2.Field1 = 23;
}
public IN N1
{
get { return _n1; }
}
public IN N2
{
get { return _n2; }
}
private class N : IN
{
private int _field1;
public int Field1
{
get { return _field1; }
set { _field1 = value; }
}
}
}
}
В зависимости от того, как вам нужно раскрыть дочерний класс N
, это может сработать.
Можно объявить внутри E
частный интерфейс IN
, явно реализуемый N
. Этот интерфейс раскрывает члены N
, доступные только E
:
public class E
{
public void Foo()
{
IN n = new N();
n.Field1 = 42;
}
public class N : IN
{
private int _field1;
int IN.Field1
{
get { return _field1; }
set { _field1 = value; }
}
}
private interface IN
{
int Field1 { get; set; }
}
}
сделайте поля «защищенными внутренними»
, если вложенные классы являются частными, вы можете использовать явно «внутренние» для тех поля.