2015-08-28 15 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

相关问题