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

为何Dart的interface class可在同库内被继承?与官方文档不符

Dart中interface类同库内可继承的原因解析

问题描述

以下是编写的Dart代码:

interface class Vehicle {
  int current_state = 0;

  void moveForward(int meters) {
    // ...
  }
}

// Can be constructed.
Vehicle myVehicle = Vehicle();

// ERROR: Can't be inherited.
class Car extends Vehicle {
  int current_state = 12;

  int passengers = 4;
  // ...

  @override
  moveForward(int meters) {
    current_state = current_state + meters;
  }
}

// Can be implemented.
class MockVehicle implements Vehicle {
  int current_state = 0;

  @override
  void moveForward(int meters) {
    // ...
  }
}

void main() {
  Car ACar = new Car();

  ACar.moveForward(5);

  print(ACar.current_state);
}

根据Dart官方文档说明:

使用interface修饰符定义接口时,该接口所在库之外的代码只能实现该接口,不能继承。

但上述同库内的代码中,Car类继承Vehicle并未报错,与预期不符,请问这是为什么?

原因解析

  • interface类的继承限制仅针对定义该类的库之外的代码生效,同库内的类不受此约束,依然可以正常继承该类。
  • Dart的类修饰符(包括interface)的访问控制逻辑基于库边界设计,目的是对外仅暴露接口实现能力,同时允许库内部代码灵活复用类的结构与逻辑。
  • 你代码中的Vehicle和Car属于同一个默认库,因此Car继承Vehicle完全符合语法规则,不会触发错误。

内容的提问来源于stack exchange,提问作者JaeYeon Won

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 11:42:39