首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >私有和非私有初始化器在(Dart)私有和非私有类构造函数中的作用?

私有和非私有初始化器在(Dart)私有和非私有类构造函数中的作用?
EN

Stack Overflow用户
提问于 2021-04-27 13:53:59
回答 1查看 283关注 0票数 1

我是刚接触OOP的人,目前有中级水平的理解。通过学习Dart和C#,我不断地取得进展。我还在探索设计模式,以便真正了解所有的设计模式是如何根据不同的场景进行单击的。目前,我正在尝试理解以下4种与类构造函数相关的场景。我理解在构造函数级别和初始化器级别上下划线的含义。但我正在寻找的东西,可能似乎是相当明显和清楚有经验的程序员在那里。请分享你宝贵的见解,因为我不知道我在这里错过了什么。

场景1:没有初始化器的私有构造器

我知道这和辛格尔顿不一样。Singleton允许单次实例化,下面甚至不允许一次实例化。还有什么别的吗?

真实世界的例子:

代码语言:javascript
复制
class Firebase {
  // Ensures end-users cannot initialize the class.
  Firebase._();
...
}

场景2:带有可选公共或非私有初始化器的私有构造器

这种具有非私有初始化器(this.app)的私有构造函数的用途是什么?为什么在私有构造函数中有一个非私有初始化器(this.app)?通过这样做取得了什么成果?

真实世界的例子:

代码语言:javascript
复制
class FirebaseAuth extends FirebasePluginPlatform {
/// The [FirebaseApp] for this current Auth instance.
  FirebaseApp app;

  FirebaseAuth._({required this.app})
      : super(app.name, 'plugins.flutter.io/firebase_auth');

  /// Returns an instance using the default [FirebaseApp].
  static FirebaseAuth get instance {
    FirebaseApp defaultAppInstance = Firebase.app();

    return FirebaseAuth.instanceFor(app: defaultAppInstance);
  }
...
}

场景3:带有私有初始化器的公共构造器

为什么在非私有构造函数中有私有属性?通过这样做取得了什么成果?

虚构的例子:

代码语言:javascript
复制
class Constructify {
  Map<String,dynamic> _property;
  Constructify(this._property);
...
}

场景4:带有私有初始化器的私有构造器

构造函数本身是私有的,为什么要有私有初始化程序呢?通过这样做取得了什么成果?

真实世界的例子:

代码语言:javascript
复制
class FirebaseApp {
  /// A [FirebaseApp] instance can only be accessed from a call to `app()` [FirebaseCore].
  ///
  /// This constructor ensures that the delegate instance it is constructed with is one which extends [FirebaseAppPlatform].
  FirebaseApp._(this._delegate) {
    FirebaseAppPlatform.verifyExtends(_delegate);
  }

  final FirebaseAppPlatform _delegate;
...
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-27 14:41:57

场景1:Dart中的_意味着变量/方法/函数/构造函数是包私有的。因此,只要我们在同一个包中,我们就可以使用该字段。因此,在场景1中,这实际上意味着只有从声明Firebase的包调用构造函数时,才能创建Firebase对象。这还将阻止您在另一个包中扩展类,因为我们无法调用我们正在扩展的Firebase类的构造函数。

场景2:包私有构造函数确保对象只能由来自同一个包的代码创建。命名的app参数被标记为required,因此它不是可选的。在创建对象之后,您可以在本例中更改app变量。我不知道这在这个场景中是否有意义,但你可以做到。在大多数情况下,我会正确地将app标记为final

场景3:可以使用构造函数将私有字段设置为值,但是由于字段是包私有的,所以我们可以确保包之外的任何人事后都不能访问该字段。

场景4:包私有构造函数由同一包中的其他代码使用。如果希望确保只允许自己的包创建FirebaseApp的新对象,并且不希望包外的代码访问字段_delegate,则可以执行此示例所做的操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67284477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档