Как я могу ограничить класс, чтобы быть creatable только в другом классе?

Я повреждал мозг, чтобы выяснить, как сделать это в C#. У меня есть класс TextGrid, который является по существу сеткой MxN текста. Я хотел бы иметь класс Курсора, который поддерживает (X, Y) положение в TextGrid, а также методы для перемещения положения, запросов текущей позиции, и т.д. Идеально, я хотел бы за этот класс не быть creatable за пределами TextGrid, так как это бесполезно, не будучи присоединен логически к TextGrid.

Однако мои подходы для занятия этим не в нормальном состоянии: я попытался иметь 1) Курсор быть общедоступным классом, вложенным в TextGrid с частным конструктором, 2) Курсор быть частным классом, вложенным в TextGrid с общедоступным конструктором и 3) Курсор быть его собственным отдельным общедоступным классом за пределами TextGrid с общедоступным конструктором. № 1 не работает, потому что я не могу инстанцировать Курсора из TextGrid из-за частного конструктора. № 2 не работает, потому что я не могу возвратить созданный объект Курсора за пределами TextGrid (например, GetCursor () метод) из-за ограничений доступа. И № 3 не помогает вообще.

В значительной степени то, что я хотел бы сделать, имеют эквивалент Итератора Java в C#. Действительно ли это возможно?

8
задан Mark LeMoine 8 August 2010 в 06:31
поделиться

2 ответа

Используйте # 2, но возвращайте его через интерфейс:

public interface ICursor
{

}

public class TextGrid
{
  private class Cursor : ICursor
  {
  }

  // This could be a property if it doesn't require much calculation.
  public ICursor GetCursor()
  { 
  }
}
7
ответ дан 5 December 2019 в 18:55
поделиться

Хотя использование интерфейса для решения проблемы - хороший подход, если вы просто хотите, чтобы каждый экземпляр класса Cursor ассоциировался с экземпляром класса TextGrid, вы можете просто потребовать от создателя передавать аргумент типа TextGrid в конструктор в таком виде:

public class Cursor
{
    public Cursor(TextGrid owner)
    {
        ...
    }
}
2
ответ дан 5 December 2019 в 18:55
поделиться
Другие вопросы по тегам:

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