compiler-construction - 为什么Dart中有特殊的 “sealed”类,我该怎么做?

标签 compiler-construction programming-languages dart grammar ambiguity

Dart中似乎有一些特殊的类,例如num,通常不能由用户定义的类继承,尽管Dart语法本身没有任何阻止它的类(例如Java的final或C#的sealed)。 num由内置的intdouble继承。

  • 为什么?这种限制不应该出现在语言的语法中吗?
  • 有什么我可以自己创建这样的类的方法,这些类被部分或完全“密封”以防止继承?
  • 最佳答案

    这是odt_a上Dart Team的类似问题的官方答案。

    吉拉德·布拉查(Gilad Bracha)在此场合表示:

    您几乎可以将int,double,bool,Null和String视为Java中的最终类(num不适合该模具,因为它具有子类型)。根据设计,我们不支持最终类,以最大程度地减少复杂性并避免无法子类化的代码(就像提交者想要的那样)。我们选择了不能扩展的类型列表,而不是最终的类。

    原因:因为这些对于效率至关重要。这不是一个非常纯粹的论据,但实用的是,大多数人会以灵活性换取更快的系统。

    ++++++++

    RE:来自我的评论:这确实不是一个很纯粹的论点,因为这最终无助于使语言更清晰,更好。

    ++++++++

    同样,这不是脱离上下文的说法,但这是2012年6月29日的官方立场。

    也许今天Dart团队有另一种解释,但只有在对提出的问题进行正式答复后才能使用。

    附言

    感谢Ringtaff以获取此答案的链接。

    附言

    如果您想使Dart语言更清晰,更好,请在此官方立场上留下您的评论。

    后记:

  • 这不是灵活性,这是一个决定性的决定(关于语言设计及其环境的实现)。
  • 关于compiler-construction - 为什么Dart中有特殊的 “sealed”类,我该怎么做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20882376/

    相关文章:

    scala - 为什么不允许在方法内部重载方法(例如重载闭包)?

    java - 如何让 IntelliJ IDEA 对 Java 使用 javac 而对 Scala 使用 scalac?

    c++ - 如何构建像 Thunderbird 这样的应用程序?我应该选择哪种语言?

    language-agnostic - 为什么要区分返回值的方法和不返回值的方法?

    flutter - 有一个适合上下文 flutter 大小的容器吗?

    compiler-construction - Lisp 如何既是动态的又是可编译的?

    c - 无法编译 super 简单的代码

    Java:重写具有不同返回类型的派生类中的方法?

    dart - http.get() 不在 header 中添加我的参数

    dart - Dart for Web REST API登录示例