Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Interface 为什么Dart';是否实例化s的内置列表接口?_Interface_Dart - Fatal编程技术网

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();