2015-08-28 16 views
2

你好,我正在與統一3D合作,使我與lidgren自己的網絡。有可能禁止childclass定義一個類?

我也有一次這個問題,當我爲我做了一個自定義的GUI但沒有大問題。對其他開發者的小警告沒有多大幫助。

但是這次我需要更好的解決方案。

可以說我有一個BaseClass的和兒童:

public class BaseClass : MonoBehavior { 
    void Update() { 
     //my connectionhandler 
    } 
} 

public class Child : BaseClass { 

    // forbid it to define Update 
    void Update() { 

    } 

    // or let him use it but without writing base.Update() it should still use BaseClass Update() 

} 

正如你這兩類看到我有無效更新()。這個問題是,如果孩子使用無效更新以及基地更新不再被調用。有可能避免它。示例如果base已經定義了它,限制對Update方法的訪問? 或者可以讓無效更新的孩子使用的定義(),但基類也應該能夠用自己的更新()(背景工作:P)

其他開發人員不應該使用每次base.Update() 。我相信他們會忘記這麼多次:)

+0

你會添加密封到meathod –

+0

你有沒有考慮添加事件的更新方法,而不是?允許消費者添加BeforeUpdate和AfterUpdate事件處理程序來運行自定義代碼,但Update本身始終會運行? – Eris

+0

不,如果我那麼我會讓他們使用base.Update():)。問題是統一本身。我沒有注意到Update()在其他方面工作爲自定義函數。我無法阻止它。我正在考慮線程化。但它並不安全 – MaZy

回答

0

您正在尋找sealed關鍵字,它可以阻止進一步派生類重寫virtual方法。

+0

不幸的是,Mono沒有定義'Update()'作爲一個虛擬方法,它根本沒有定義,它實際上使用了反射來調用'Update()'函數。 –

+0

@ScottChamberlain:有趣。 '私人'會工作嗎? (他們是否通過'BindingFlags.NonPublic'?) – SLaks

+0

是的,[它確實](http://answers.unity3d.com/questions/33828/public-or-private.html)。 –

0

這很醜,但你可以用運行時檢查來處理它。實現它只會運行在調試版本上,但這應該意味着如果開發人員至少運行自己的代碼,他們會得到一個錯誤。

public class BaseClass : MonoBehavior { 
    void Update() { 
     //my connectionhandler 
    } 

    public BaseClass() { 
     Debug.Assert(!OverridesUpdateMethod(), "Do not override Update()!"); 
    } 

    [Debug] 
    private bool OverridesUpdateMethod() { 
     return GetType() != typeof(BaseClass) && 
       GetType().GetMethod("Update", BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) != null; 
    } 
} 
+0

很感謝。我會測試它。不幸的是,我已經創建了一個線程(更多的定時器和間隔)。它運作良好,但也很醜陋:) – MaZy

相關問題