Dart-从父类隐藏方法/从父类调用私有方法



我有一个扩展另一个的类。父类不打算被API直接使用,而是实现了作为子类助手的基本方法。

当我在程序中使用子类时,我可以看到所述类中的所有方法,也可以看到父类中不打算直接调用的方法,它们的存在是为了由子类的方法调用。

我试着把父母的方法保密。只要父母和孩子在同一个库中声明,我相信这会起作用。但我对";图书馆";概念我知道的一部分/一部分有点贬值,我希望父类在一个特定的文件中。我想不出进出口的办法。

有没有一种方法可以隐藏父类的公共方法,使其不受所有子类的使用,或者使父类的私有方法可以从所有子类调用?

致以最良好的问候;

示例:

myLib.dart

export mainClass.dart;

mainClass.dar

import baseClass.dart;
class MainClass extends BaseClass {
publicFunc() => ... //Can't call _hiddenFunc, can call wantToHideFunc()
}

在第二个文件中(出于代码可重用性的目的(

class MainClass extends BaseClass {
_hiddenFunc() => ...
wantToHideFunc() => ...
}

使用myLib公共API

import myLib.dart
main() {
class = Class();
class.publicFunc(); //Intended
class.wantToHideFunc() //Wants to avoid...
}

Dart不像Java或C#那样具有protected访问权限。您不能隐藏公共成员,也不能从其他库访问私人成员,而且没有第三种选择。

听起来您想要的是只能从子类调用的超类成员,而不能从对象外部调用。这就是Java中所谓的protected,Dart没有类似的东西。Dart中唯一的隐私级别是库私有,它是通过以_开头的名称来选择的。

Dart之所以有这种设计,是因为它最初是一种非常动态的语言。您可以预成型";动态调用";对于静态类型为dynamic的值,比如dynVal.foo(42),它将调用该名称的方法。为了使名称不可访问,它还需要避免动态调用。正因为如此,Dart privacy并不关心进行调用的代码在哪里,它只关心您是否知道名称-根据它们来自哪个库,库私有名称被视为不同的名称。

part实际起作用的情况下,不鼓励使用它。如果你可以将零件放入自己的库中,更好,因为它允许它拥有自己的隐私和导入,但如果你需要共享隐私的类,使用零件文件来分割一个大文件是完全合理的。这是一种工具,当它是适合工作的工具时,使用它没有错。库通常是实现模块化的更好工具,但并不总是如此。

现在,有一个破解你可以使用:

// Declare the base and provide extensions for "protected" members:
abstract class Base {
int get _someHiddenStuff => 42;
int get somePublicStuff => 37;
}
extension ProtectedBase on Base {
int get someHiddenStuff => _someHiddenStuff;
}

然后将其导入另一个库并执行:

import "base.dart";
export "base.dart" hide ProtectedBase;
class SubClass extends Base {
int doSomething => someHiddenStuff + somePublicStuff;
}

然后任何导入";子类dart";还将获得Base的版本,但他们不会获得ProtectedBase扩展。从包的公共API隐藏扩展将允许您自己使用它,但会阻止包的用户看到助手扩展。

(这可能是高度过度设计的,但这是一种选择。这是拥有不导出的静态/顶级助手功能的黑客的进化。(

最新更新