我正在阅读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
?
答案 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.dart
和derived.dart
文件中(其中derived.dart
添加import 'base.dart';
),那么它将被接受。
答案 1 :(得分:0)
摘自文档:
与Java不同,Dart没有关键字public,protected和 私人的。如果标识符以下划线_开头,则该标识符专用于 它的图书馆。
这意味着在图书馆而不是课堂上存在隐私。
要在其他文件中使用它,则需要将库导入文件中。