如何在Dart中将重写的函数设为私有?
Dart子类重写方法设为私有实现方案
Dart里用下划线_标记成员为私有,这类成员只能在当前文件里访问。现在遇到这么个场景:
parent.dart文件里的Parent类有个公开的func()方法child.dart里的Child类继承自Parent,重写了func(),现在想把这个重写后的方法设为私有
先看现有代码:
// parent.dart class Parent { void func() { print("parent"); } } // child.dart class Child extends Parent { // 如何将此方法设为私有 @override void func(){ super.func(); print("child"); } }
直接给Child的func()加下划线变成_func()是行不通的——这会改变方法签名,等于重新定义了一个私有方法,不是对父类func()的重写,父类那个公开的func()还是能被外部调用。
要解决这个问题,核心是保留对父类方法的重写,但把这个方法的对外访问入口藏起来,下面两种方案可以实现:
方案一:用工厂构造函数返回私有抽象类实例
- 在
child.dart里定义一个只有当前文件能看到的私有抽象类,让Child继承Parent的同时实现这个抽象类 - 对外提供一个工厂构造函数,返回这个私有抽象类的实例,这样外部拿不到
Child类型的对象,自然没法访问重写的func()
代码示例:
// child.dart // 私有抽象类,仅当前文件可见 abstract class _PrivateChild { // 这里只定义需要对外暴露的方法,别放func() } class Child extends Parent implements _PrivateChild { // 工厂构造函数,对外返回_PrivateChild类型 factory Child() => Child._internal(); // 私有构造函数,防止外部直接实例化Child Child._internal(); @override void func() { super.func(); print("child"); } }
外部调用时,只能通过Child()拿到_PrivateChild实例,根本调用不到func()方法。
方案二:把Child类设为私有,对外用包装类
把Child改成私有类,再创建一个公开的包装类,只暴露需要对外提供的功能,完全不碰func()方法。
代码示例:
// child.dart // 私有子类,仅当前文件可见 class _Child extends Parent { @override void func() { super.func(); print("child"); } // 对外需要暴露的其他方法 void publicMethod() { print("public method"); } } // 公开的包装类,外部只能通过它使用功能 class ChildWrapper { final _Child _child = _Child(); // 只暴露允许外部调用的方法 void publicMethod() => _child.publicMethod(); }
外部通过ChildWrapper使用,根本接触不到_child里的func()方法。
关键点提醒
Dart的私有是文件级别的,而且子类重写父类的公开方法时,没法直接把重写后的方法改成私有——毕竟父类的方法是公开的,子类实例转成父类类型后还是能调用func()。所以上面两个方案的核心都是不让外部直接持有Child类型的实例,从根源上隐藏重写的方法。
内容的提问来源于stack exchange,提问作者nicks101
相关产品推荐
相关产品推荐

