【问题标题】:It is possible to forbid childclass to define a class?可以禁止子类定义一个类吗?
【发布时间】:2015-11-23 15:50:10
【问题描述】:

您好,我正在使用 unity 3D 与 lidgren 建立自己的网络。

当我为我制作自定义 gui 时,我也遇到过这个问题,但不是什么大问题。对其他开发人员的一个小警告没有多大帮助。

但这次我需要更好的解决方案。

假设我有一个 BaseClass 和一个 Child:

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()

}

正如您在这两个类中看到的,我有 void Update()。这个问题是如果孩子也使用 void Update ,那么基本的 Update 就不会再被调用了。是可以避免的。如果 base 已经定义了它,示例限制对更新方法的访问? 或者可以让孩子使用 void Update() 的定义,但基类也应该能够使用他自己的 Update() (后台工作:P)

其他开发人员不应每次都使用 base.Update()。我相信他们会忘记很多次:)

【问题讨论】:

  • 你会添加密封的肉类
  • 您是否考虑过将事件添加到 Update 方法中?允许消费者添加 BeforeUpdate 和 AfterUpdate 事件处理程序以运行自定义代码,但更新本身将始终运行?
  • 不,如果我愿意,我会让他们使用 base.Update() :)。问题在于团结本身。我没有注意到 Update() 作为自定义函数工作。我无法阻止它。我现在正在考虑线程。但它不是很安全
  • 您可以通过将“将警告视为错误”设置为“特定警告”为“0108”来使 CS0108 警告成为错误。它仍然不是一个完美的解决方案,因为错误会告诉开发人员在方法中添加“新”。这至少意味着他们不能再忽视警告。

标签: c# class inheritance restriction


【解决方案1】:

您正在寻找 sealed 关键字,它可以防止进一步派生的类覆盖 virtual 方法。

【讨论】:

  • 很遗憾,Mono 没有将Update() 定义为虚方法,根本没有定义它,它实际上是使用反射来调用Update() 函数。
  • @ScottChamberlain:很有趣。 private 会工作吗? (他们是否通过BindingFlags.NonPublic?)
  • 是的,it does
  • 嗯,我看到统一对我来说是不可能的。我的意思是我可以定义带或不带虚拟的 void Update。一样的。
【解决方案2】:

这很难看,但您可以通过运行时检查来处理它。在实现时,它只能在调试版本上运行,但这应该意味着开发人员如果至少运行自己的代码就会收到错误。

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;
    }
}

【讨论】:

  • 很酷,谢谢。我会测试它。不幸的是,我已经用线程制作了一个(更多的是定时器和间隔)。它工作得很好,但也很丑:)
猜你喜欢
  • 2014-05-25
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 2011-09-29
相关资源
最近更新 更多