如何限制一个类只能在另一个类中创建?

时间:2010-08-08 06:31:56

标签: c# oop

我一直在打破我的大脑,想弄清楚如何在C#中做到这一点。我有一个TextGrid类,它本质上是一个MxN文本网格。我想要一个Cursor类来维护TextGrid中的(X,Y)位置,以及移动位置,查询当前位置等的方法。理想情况下,我希望这个类不是可以在TextGrid之外创建,因为它没有逻辑地连接到TextGrid,它是无用的。

然而,我解决这个问题的方法还不尽如人意:我已经尝试过1)Cursor是一个嵌套在TextGrid中的公共类,带有私有构造函数,2)Cursor是嵌套在TextGrid中的私有类,带有public构造函数,以及3)Cursor是TextGrid之外的公共构造函数。 #1不起作用,因为由于私有构造函数,我无法从TextGrid中实例化Cursor。 #2不起作用,因为由于访问限制,我无法在TextGrid之外返回创建的Cursor对象(例如GetCursor()方法)。并且#3完全没有帮助。

相当多,我想要做的就是在C#中使用Java的Iterator。这可能吗?

2 个答案:

答案 0 :(得分:7)

使用#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()
  { 
  }
}

答案 1 :(得分:2)

虽然使用接口来解决问题是一种很好的方法,但如果您只想让Cursor类的每个实例都与TextGrid类的实例相关联,那么您只需要创建者将类型为TextGrid的参数传递给构造函数:

public class Cursor
{
    public Cursor(TextGrid owner)
    {
        ...
    }
}