我才刚刚开始学习飞镖编程语言。
我偶然发现的事情是进行访问修饰符(如public / private)的较不常规的方式(至少与我对C#,Java和C ++的经验相比)。
据我了解,在成员变量前加上_字符将使该lib(文件)私有。
那么,将单个类强制实施到单个文件/ lib,以强制执行类似于类级别public / private的行为,是否是常见的做法?
这还会导致一个类的所有后代必须位于同一类中。
如果这不是常见做法,那么您如何精确地在飞镖中进行OOP?您如何在Dart中实现OOP概念,例如封装和合成?
答案 0 :(得分:2)
Dart中没有“私人类”,只有“图书馆私人”。
基础设计基于这样一个思想:单个库就是一个实体,由具有相同目标的同一个人创建和编辑。您无需为自己的合著者辩护。毕竟,如果您尝试向合著者隐藏某些东西,他们可以只更改您的班级以使其公开。因此,完整的库是访问管理的粒度。
创建多个小型库很容易,因此您可以使一个库仅包含实际相关的内容。如果这样做,那么就不必再阻止对象之间的访问,因为它们应该一起设计,所以访问可能是有意的。
库也是实现的粒度。一个库公开其公共接口,但是实现细节是(库)私有的,因此更改实现细节不应破坏其他库。这样可以安全地更改实现;只要您仅更改私人物品,就保证没有其他库会损坏。
也就是说,私有成员可以看作是实施细节。如果您需要访问另一个类的实现,而不仅是它的公共接口,那么您就深深地依赖于该实现,并且代码应该位于同一个库中。
只有很少的相关和相互依存的类,有时甚至是一个类的图书馆才是前进的道路,也是人们通常要做的事情。 然后,如果您希望包库公开很多类,则可以导出这些单独的库。
对于类的后代:Dart没有受保护的访问限制,因此,如果子类需要访问某些内容,则它必须是公共的,或位于同一文件中。有一些棘手的解决方法,但对于这两种方法之一通常更简单。同样,如果另一个类需要访问非公开的内容,则它与实现相关,并且应与该实现保持紧密联系。
封装意味着阻止访问实现细节。您可以在库级别执行此操作。在图书馆内部,仅做您打算做的事情是您自己的责任。合成的工作方式与其他任何OO语言相同。
答案 1 :(得分:-1)
来自Dart文档:
Unlike Java, Dart doesn’t have the keywords public, protected, and private.
If an identifier starts with an underscore _, it’s private to its library.
库不仅提供API,而且是隐私的单位:以下划线_开头的标识符仅在库内部可见。
此answer可能会对您有所帮助。