2009-11-09 157 views
1

我有一个名为GamePlay的ViewController类。在GamePlay中有一个名为MyPinAnnotationView的嵌套类。当MyPinAnnotation的方法TouchesBegan()被调用时,我想从父GamePlay中调用方法CheckAnswer()。嵌套的C#类 - 从内部调用外部方法

我不想创建一个新的GamePlay实例,因为我已经设置了变量和实例。我可以通过某种方式访问​​家长吗? (除了事件监听器)

+0

这里有一个文章雷蒙德陈写了一段时间后(与我有关JScript的后记):http://blogs.msdn.com/oldnewthing/archive/2006/08/01/685248.aspx – 2009-11-09 19:29:47

+0

还有一些关于JScript中此功能的注释: http://blogs.msdn.com/ericlippert/archive/2005/05/02/414015.aspx – 2009-11-09 19:31:58

回答

9

嵌套类只能引用父代中的静态成员。如果你想访问实例成员,你需要获得对实例的引用。要做到这一点最简单的方法是把它作为一个参数添加到的MyPinAnnotationView构造像这样:

class MyPinAnnotationView 
{ 
    private GamePlay gamePlay; 

    public MyPinAnnotationView(GamePlay gamePlay) 
    { 
    this.gamePlay = gamePlay; 
    } 

    public void TouchesBegan() 
    { 
    this.gamePlay.CheckAnswer(); 
    } 
} 

当您从GamePlay实例MyPinAnnotationView,只是这样做:

MyPinAnnotation annotation = new MyPinAnnotation(this); 
1

如果你想访问的方法不是静态的,那么你将需要一个对父对象的引用(我通常将父对象引用作为构造器参数传入)以便访问它方法。毕竟,你的子类需要知道它所关联的父类的哪个实例。

+0

谢谢。说得通。 – Bryan 2009-11-09 21:52:16

1

简单/快速的方法是在子对象中保留对父类的引用,使CheckAnswer()为公共,然后在需要时调用该方法很容易......但您可能想回顾并查看设计以确保这是适当的。

0

嵌套类只能由父类使用(see this post)。除非有很好的理由,否则他们不应该被其他班级公开看到。哪些没有。

我会建议重构这个。尝试将GamePlay的所有API移动到GamePlay类中。换句话说,TouchesBegan()应调用GamePlay类,然后调用MyPinAnnotations类。

没有其他人应该知道关于MyPinAnnotations类 - 如果他们需要,那么它表示设计失败。