Dart实现一个类还会继承其字段吗?

时间:2019-05-10 15:45:28

标签: dart

我正在阅读Dart https://dart.dev/guides/language/language-tour#implicit-interfaces语言之旅:

class Person {

  final _name; /* this is the field of Person */

  ...
}


class Impostor implements Person {

  get _name => ''; /* so it's inherited? */

  String greet(String who) => 'Hi $who. Do you know who I am?';
}

在Java中,接口中只有常量(public static final)。看来Impostor也从final _name继承了Person

2 个答案:

答案 0 :(得分:1)

  

看来Impostor也从final _name继承了Person吗?

要视情况而定。

隐私

如果实现类与基础库位于相同的 library 中(通常这意味着一个不同的Dart文件),则实现类将可见基础类的私有接口,并且必须将其实现为好吧。

如果实现类位于 库中,则基类的私有接口将不可见,并且实现类也不希望实现私有成员。

字段

(可见)字段是类的界面的一部分。需要一个实现类来实现该可见接口。如果基类具有公共字段,则实际上仅意味着其接口公开了具有该名称的公共 getter setter 方法。

您可以自己观察。如果您将以下两个类都放在同一个Dart文件中:

class Base {
  Base() : _x = 42;

  final int _x;

  void _f() {}
}

class Derived implements Base {
}

您会得到一个错误:

Error: The non-abstract class 'Derived' is missing implementations for these members:
 - Base._f
 - Base._x
Try to either
 - provide an implementation,
 - inherit an implementation from a superclass or mixin,
 - mark the class as abstract, or
 - provide a 'noSuchMethod' implementation

但是将它们分别放在base.dartderived.dart文件中(其中derived.dart添加import 'base.dart';),那么它将被接受。

答案 1 :(得分:0)

摘自文档:

  

与Java不同,Dart没有关键字public,protected和   私人的。如果标识符以下划线_开头,则该标识符专用于   它的图书馆。

这意味着在图书馆而不是课堂上存在隐私。

要在其他文件中使用它,则需要将库导入文件中。