You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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()还是能被外部调用。

要解决这个问题,核心是保留对父类方法的重写,但把这个方法的对外访问入口藏起来,下面两种方案可以实现:

方案一:用工厂构造函数返回私有抽象类实例

  1. 在child.dart里定义一个只有当前文件能看到的私有抽象类,让Child继承Parent的同时实现这个抽象类
  2. 对外提供一个工厂构造函数,返回这个私有抽象类的实例,这样外部拿不到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 08:14:53