Interface 为什么Dart';是否实例化s的内置列表接口?
注意:这个问题已经过时了;Interface 为什么Dart';是否实例化s的内置列表接口?,interface,dart,Interface,Dart,注意:这个问题已经过时了;接口声明语法已从Dart中删除: 在Dart中,每个类都产生一个隐式接口。现在实现了这个功能,就可以从语言中消除接口声明。接口声明被纯抽象类取代 据我所知,在中实例化接口是不可能的。如果我只是尝试构造一个新的MyInterface(),无论是否定义了构造函数,我都会得到一个运行时错误(): NoSuchMethodException-接收器:“”函数名:'MyInterface$$Factory'参数:[] 如果我尝试使用工厂构造函数,返回一个实现的实例,我
接口
声明语法已从Dart中删除:
在Dart中,每个类都产生一个隐式接口。现在实现了这个功能,就可以从语言中消除接口声明。接口声明被纯抽象类取代
据我所知,在中实例化接口是不可能的。如果我只是尝试构造一个
新的MyInterface()
,无论是否定义了构造函数,我都会得到一个运行时错误():
NoSuchMethodException-接收器:“”函数名:'MyInterface$$Factory'参数:[]
如果我尝试使用工厂构造函数,返回一个实现的实例,我会得到一个编译时错误():
SyntaxError:接口中不允许使用工厂成员
然而,这似乎与Dart核心库中的List
1是一个interface2的现实不符,但它有几个构造函数,可以实例化。例如,这很好():
为什么可以实例化列表
和许多其他内置接口?是否有一些方法我错过了,或者他们只是作为内置类型接受特殊处理
1
2“Dart核心库的大部分是根据接口定义的。”3
3定义接口的语法为:
interfaceDefinition:
interface identifier typeParameters? superinterfaces? factorySpecification? `{' (interfaceMemberDefinition)* `}'
请注意,factorySpecification
必须位于接口主体之前,而不是其内部
这就是你写它的方式:
interface MyInterface default MyImplementation {
}
class MyImplementation implements MyInterface {
MyImplementation();
}
或者,如果您想获得完整的通用定义:
interface MyInterface<E> default MyImplementation<E> {
MyInterface(x);
}
class MyImplementation<E> implements MyInterface<E> {
MyImplementation(this.x);
E x;
}
interface-MyInterface-default-MyImplementation{
MyInterface(x);
}
类MyImplementation实现MyInterface{
MyImplementation(this.x);
ex;
}
编辑:有关更完整的示例,您可以阅读位于的
接口列表
的源代码,相关的类列表工厂
源代码位于Dart使用工厂
处理两种不同的事情:工厂类和工厂构造函数。工厂类如下所示:
interface List default ConcreteList {
List();
...
}
class ConcreteList implements List {
ConcreteList() {}
}
class Point {
static _zero;
int x, y;
Point(this.x, this.y) {}
factory Point.zero() {
if (_zero == null) _zero = new Point(0, 0);
return _zero;
}
}
它的作用是允许您在接口中定义构造函数。当您通过执行newlist()
(或任何接口)调用它们时,它知道实际实例化ConcreteList
,因为这是您为该接口指定的工厂类
这为您提供了一种完全封装接口后面的具体类型的方法,甚至包括构造点
工厂构造函数如下所示:
interface List default ConcreteList {
List();
...
}
class ConcreteList implements List {
ConcreteList() {}
}
class Point {
static _zero;
int x, y;
Point(this.x, this.y) {}
factory Point.zero() {
if (_zero == null) _zero = new Point(0, 0);
return _zero;
}
}
这里,Point.zero
是一个(命名的)工厂构造函数。工厂构造函数允许抽象实例化。您可以像调用常规构造函数一样调用它们,但它们不会自动生成对象的新实例。相反,您可以在构造函数体中自由地执行任何操作。在这里,每次您这样做:
new Point.zero();
即使每次使用new
,也会得到相同的缓存\u zero
对象,因为它们的工厂构造函数总是返回相同的对象。它们有两个用途:
new
的类,但在某些情况下,您可能实际上希望返回它的子类,以便专门化它的行为。工厂构造器允许您在不更改调用站点的情况下执行此操作也许标题应该是“为什么不能…..”@ p4010:也许它可能是“为什么不能用户定义的接口…”,但是<代码>列表< /C>接口可以。请考虑更新这个问题,表明它是基于前阿尔法DART语法。现在学习Dart的人可能很困惑,因为界面语法被删除了。干杯;)@GregLowe我没有使用飞镖,所以我没有意识到这一点。我现在要添加一个通知。从Dart(我几乎键入了“Java”)文档中:在Dart中,您通常可以直接从接口创建对象,而不必查找实现该接口的类。这是可能的,因为许多接口都有一个工厂类——一个创建实现接口的对象的类。例如,如果代码显示new Date.now(),则Date接口的factory类将创建一个表示当前时间的对象。“此信息现已过时。Dart不再具有界面关键字。我们应该注意,
接口列表工厂具体列表
现在是接口列表默认具体列表
class Point {
static _zero;
int x, y;
Point(this.x, this.y) {}
factory Point.zero() {
if (_zero == null) _zero = new Point(0, 0);
return _zero;
}
}
new Point.zero();