Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 私营及私营机构的角色;(Dart)private&;中的非私人初始值设定人;非私有类构造函数?_Oop_Dart_Constructor - Fatal编程技术网

Oop 私营及私营机构的角色;(Dart)private&;中的非私人初始值设定人;非私有类构造函数?

Oop 私营及私营机构的角色;(Dart)private&;中的非私人初始值设定人;非私有类构造函数?,oop,dart,constructor,Oop,Dart,Constructor,我是OOP新手,目前对OOP的理解处于中级水平。我通过学习飞镖和C#不断取得进展。我也在探索设计模式,以真正理解如何根据不同的场景将所有的功能组合在一起。到目前为止,我试图理解以下4个与类构造函数相关的场景。我理解下划线在构造函数级别和初始值设定项级别的含义。但我正在寻找一些对有经验的程序员来说可能非常明显和清晰的东西。请分享你的宝贵见解,因为我不知道我在这里遗漏了什么 场景1:没有初始值设定项的私有构造函数 我知道这和单身不同。Singleton允许单个实例化,下面的示例甚至不允许一次。还有别

我是OOP新手,目前对OOP的理解处于中级水平。我通过学习飞镖和C#不断取得进展。我也在探索设计模式,以真正理解如何根据不同的场景将所有的功能组合在一起。到目前为止,我试图理解以下4个与类构造函数相关的场景。我理解下划线在构造函数级别和初始值设定项级别的含义。但我正在寻找一些对有经验的程序员来说可能非常明显和清晰的东西。请分享你的宝贵见解,因为我不知道我在这里遗漏了什么

场景1:没有初始值设定项的私有构造函数 我知道这和单身不同。Singleton允许单个实例化,下面的示例甚至不允许一次。还有别的吗

现实世界的例子:

class Firebase {
  // Ensures end-users cannot initialize the class.
  Firebase._();
...
}
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);
  }
...
}
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;
...
}
场景2:具有可选公共或非私有初始值设定项的私有构造函数 这种具有非私有初始值设定项(this.app)的私有构造函数有什么用?为什么在私有构造函数中有一个非私有初始值设定项(this.app)?通过这一点可以实现什么

现实世界的例子:

class Firebase {
  // Ensures end-users cannot initialize the class.
  Firebase._();
...
}
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);
  }
...
}
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;
...
}
场景3:带有私有初始值设定项的公共构造函数 为什么在非私有构造函数中有私有属性?通过这一点可以实现什么

虚构的例子:

class Constructify {
  Map<String,dynamic> _property;
  Constructify(this._property);
...
}

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

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

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


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

您好,欢迎使用堆栈溢出。就目前而言,你的问题有点过于宽泛;请一次专注于一个问题。这里你要问6个独立的问题。@AsifShaikh没问题。如果您没有其他问题,并且认为我的答案确实回答了所有问题,请接受我的答案。