当前位置: 首页 > 知识库问答 >
问题:

私有的作用

习华灿
2023-03-14

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

我知道这和单身不同。Singleton允许单个实例化,下面甚至一次也不允许。还有别的吗?

现实世界的例子:

class Firebase {
  // Ensures end-users cannot initialize the class.
  Firebase._();
...
}

这种类型的具有非私有初始值设定项(this.app)的私有构造函数有什么用?为什么在私有构造函数中有非私有初始值设定项 (this.app)?通过这个可以实现什么?

现实世界的例子:

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 Constructify {
  Map<String,dynamic> _property;
  Constructify(this._property);
...
}

当构造函数本身是私有的时,为什么要有私有初始值设定项呢?通过这个可以实现什么?

现实世界的例子:

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

共有1个答案

姜淇
2023-03-14

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

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

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

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

 类似资料:
  • 本文向大家介绍C++ 中私有继承的作用,包括了C++ 中私有继承的作用的使用技巧和注意事项,需要的朋友参考一下 C++ 中私有继承的作用 私有继承的 第一个规则:和公有继承相反,如果两个类之间的继承关系为私有,编译器一般不会将派生类对象转换成基类对象。 第二个规则: 从私有基类继承而来的成员都成为了派生类的私有成员,即使它们在基类中是保护或公有成员。 私有继承的含义:私有继承意味着 "用...来实

  • 我们知道,JavaScript中是没有块级作用域的。也就是说,在块语句中定义的变量,实际上是在外部函数中而非在语句中创建的。如下: function outNumber (count) { for (var i = 0; i < count; i ++) { alert(i); } alert(i); } outNumber(5); //5 以上代码会弹出

  • 本书之前提到了“封装”的概念,即指将一系列指令放在一个函数体内部的处理过程。而这样的做法则是为了将函数的接口与它的实现分离(函数接口指如何使用这个函数,函数实现则指如何去实现这个函数及实现具体做了些什么)。 上面提到这种封装可以命名为“功能封装”,用以区分本章将要介绍的“数据封装”。数据封装是基于这样的理念提出的:每一个结构的定义应当包括应用于本结构的函数集以及阻止对内部的无限制访问。 数据封装的

  • 我试图模仿一个私有方法,如下所示。但是,在第4行,JUnit正在调用相关的validateLanguage方法,并且由于私有方法validateLanguage在调用其他方法时引发了异常,因此没有返回模拟值。我的理解是,使用PowerMock的JUnit应该跳过validateLanguage实际实现的调用。有人能澄清一下吗?

  • 我有一门课看起来像这样: 我想使用Mockito和Powermock为此编写一个单元测试。我知道我可以这样模仿私有方法: 但是我如何告诉它抛出异常呢?我知道会是这样的: 那里有什么? 请注意,异常是一个私有内部类,因此我不能只执行,因为从单元测试中无法访问。

  • 在 Python 的面向对象编程中,私有属性是只能在类的实例方法中访问的属性,不允许在外界访问私有属性。 1. 私有属性的定义 1.1 定义 在属性名称前加上前缀 __,表示该属性为私有属性,示例代码如下: class Object: def method(self): self.__private_attribute = 123 在第 3 行,创建一个私有属性 __pr