2009-11-09 123 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類 - 如果他們需要,那麼它表示設計失敗。