как получить доступ к членам парламента, не занимающим официального поста вложенного класса?

Фон: Я включил (порождают) класс E с вложенным классом N с несколькими экземплярами N в E. Во вложенном (родительском) классе я делаю некоторые вычисления, и я устанавливаю значения для каждого экземпляра вложенного класса. Что-то вроде этого:

n1.field1 = ...;
n1.field2 = ...;
n1.field3 = ...;
n2.field1 = ...;
...

Это - один большой метод оценки (в родительском классе). Мое намерение - так как все вычисления находятся в родительском классе (они не могут быть сделаны на вложенный экземпляр, потому что это сделало бы код более сложным) - делают методы set только доступными общественности методов считывания и родительскому классу.

И теперь существует проблема:

  • когда я делаю методы set, частный, родительский класс не может получить доступ к ним
  • когда я обнародовал их, все могут изменить значения
  • и C# не имеет друга понятием
  • Я не могу передать значения в конструкторе, потому что механизм отложенных вычислений используется (таким образом, экземпляры должны быть созданы при ссылке на них - я создаю все объекты, и вычисление инициировано по требованию),

Я застреваю - как сделать это (предельный доступ до родительского класса, ни больше, ни меньше)?


Я подозреваю, что получу вопрос ответа сначала - "но почему Вы не разделяете оценку на каждое поле" - таким образом, я отвечаю на это примером: как Вы вычисляете минуту и макс. значение набора? Быстрым способом? Ответ - в одной передаче. Поэтому у меня есть одна функция оценки, которая делает вычисления и устанавливает все поля сразу.

15
задан Thomas Levesque 12 May 2010 в 08:08
поделиться

3 ответа

Если у вас есть возможность поместить родительский и дочерний классы в другую сборку, вы можете использовать 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 , это может сработать.

7
ответ дан 1 December 2019 в 00:01
поделиться

Можно объявить внутри 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; }
    }
}
48
ответ дан 1 December 2019 в 00:01
поделиться

сделайте поля «защищенными внутренними»

, если вложенные классы являются частными, вы можете использовать явно «внутренние» для тех поля.

-2
ответ дан 1 December 2019 в 00:01
поделиться
Другие вопросы по тегам:

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