Я повреждал мозг, чтобы выяснить, как сделать это в C#. У меня есть класс TextGrid, который является по существу сеткой MxN текста. Я хотел бы иметь класс Курсора, который поддерживает (X, Y) положение в TextGrid, а также методы для перемещения положения, запросов текущей позиции, и т.д. Идеально, я хотел бы за этот класс не быть creatable за пределами TextGrid, так как это бесполезно, не будучи присоединен логически к TextGrid.
Однако мои подходы для занятия этим не в нормальном состоянии: я попытался иметь 1) Курсор быть общедоступным классом, вложенным в TextGrid с частным конструктором, 2) Курсор быть частным классом, вложенным в TextGrid с общедоступным конструктором и 3) Курсор быть его собственным отдельным общедоступным классом за пределами TextGrid с общедоступным конструктором. № 1 не работает, потому что я не могу инстанцировать Курсора из TextGrid из-за частного конструктора. № 2 не работает, потому что я не могу возвратить созданный объект Курсора за пределами TextGrid (например, GetCursor () метод) из-за ограничений доступа. И № 3 не помогает вообще.
В значительной степени то, что я хотел бы сделать, имеют эквивалент Итератора Java в C#. Действительно ли это возможно?
Используйте # 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()
{
}
}
Хотя использование интерфейса для решения проблемы - хороший подход, если вы просто хотите, чтобы каждый экземпляр класса Cursor
ассоциировался с экземпляром класса TextGrid
, вы можете просто потребовать от создателя передавать аргумент типа TextGrid
в конструктор в таком виде:
public class Cursor
{
public Cursor(TextGrid owner)
{
...
}
}