【问题标题】:Is it possible to have a private constructor in dart?飞镖中是否可以有一个私有构造函数?
【发布时间】:2019-08-04 05:02:32
【问题描述】:

我可以在 TypeScript 中执行以下操作

class Foo {
  private constructor () {}
}

所以这个constructor 只能从类本身内部访问。

如何在 Dart 中实现相同的功能?

【问题讨论】:

    标签: dart


    【解决方案1】:

    只需创建一个以_开头的命名构造函数

    class Foo {
      Foo._() {}
    }
    

    那么构造函数Foo._() 将只能从其类(和库)中访问。

    【讨论】:

    • 如何为此编写单元测试?
    • 您将无法为此私有构造函数编写单元测试。请记住,测试接口而不是实现。由于无法从库外部访问私有构造函数,因此在单元测试中测试私有方法将测试实现而不是接口。
    • 如果这是私有的,那我怎么能在课堂外做Foo._() 而不会出错?
    • @Chrillewoodz 如果您尝试从声明它的同一文件初始化该类,则可以。
    【解决方案2】:

    没有任何代码的方法一定是这样的

    class Foo {
      Foo._();
    }
    

    【讨论】:

      【解决方案3】:

      是的,有可能,想添加更多关于它的信息。

      constructor 可以使用 (_) 下划线运算符设为私有,这意味着在 dart 中是私有的。

      所以一个类可以声明为

      class Foo {
        Foo._() {}
      }
      

      所以现在,Foo 类没有默认构造函数

      Foo foo = Foo(); // It will give compile time error
      

      同样的理论也适用于扩展类,如果私有构造函数声明在一个单独的文件中也是不可能调用的。

      class FooBar extends Foo {
          FooBar() : super._(); // This will give compile time error.
        }
      

      但是,如果我们分别在同一个类或文件中使用它们,上述两个功能都可以工作。

        Foo foo = Foo._(); // It will work as calling from the same class
      

       class FooBar extends Foo {
          FooBar() : super._(); // This will work as both Foo and FooBar are declared in same file. 
        }
      

      【讨论】:

        【解决方案4】:

        只使用抽象类。 因为不能实例化抽象类

        【讨论】:

        • 私有构造类和抽象类有完全不同的用例,即如何构造抽象类的单例实例?
        猜你喜欢
        • 2018-10-29
        • 1970-01-01
        • 2020-04-03
        • 2018-10-20
        • 2013-08-28
        • 2015-05-25
        • 2011-08-16
        相关资源
        最近更新 更多