Dart语言中“未解析的超级构造函数隐式调用”是什么意思?

时间:2014-02-09 15:59:43

标签: class inheritance dart

为什么这个例子:

import "dart:html";

class SubMenuElement extends DivElement {

    SubMenuElement() {
        print("my element created");
    }

}

给出错误:

Internal error: 'file.dart': error: line x pos y: unresolved implicit call to super constructor 'DivElement()'
    SubMenuElement() {
                  ^

错误消息的含义是什么?工作示例如何?

3 个答案:

答案 0 :(得分:3)

DivElement没有默认构造函数。 您需要在super。

上添加命名构造函数和对命名构造函数的调用
SubMenuElement.created() : super.created();

如果您派生DOM元素,则应添加with Polymer

import 'dart:html';
import 'package:polymer/polymer.dart';

class SubMenuElement extends DivElement with Polymer {
  SubMenuElement.created() : super.created();
}

您尚未声明要创建Polymer元素,但只能将自定义元素用于Polymer,所以我假设您这样做。

答案 1 :(得分:2)

错误消息表示默认构造函数DivElement()不存在。隐式调用此构造函数是因为您没有指定要调用的另一个构造函数。

话虽如此,DivElement不能直接进行子类化。但您可以通过实现DivElement而不是扩展它并委派每个调用来模拟该行为:

class MyDivElement implements DivElement {

  DivElement _delegate;

  MyDivElement() {
    _delegate = new DivElement();
    // whatever else should happen in your constructor
  }

  // For best performance, every member SHOULD be implemented explicitly.
  String get text => _delegate.text;
  Node get parentNode => _delegate.parentNode;
  ShadowRoot get shadowRoot => _delegate.shadowRoot;

  // But DivElement has a lot of members.
  // Unused or rarely used members could also be delegated with reflection.
  noSuchMethod(Invocation invocation) => reflect(_delegate).delegate(invocation);

}

答案 2 :(得分:2)

您可以按如下方式声明DivElement的子类:

import 'dart:html';

class MyDiv extends DivElement {
  factory MyDiv() => new Element.tag('div', 'my-div');
  MyDiv.created() : super.created();
}

工厂构造函数不是必需的,但如果你想强制构造实例,这很方便。

然后必须先将文档注册到文档中,然后才能实例化它:

main() {
  document.register('my-div', MyDiv, extendsTag: 'div');
  document.body.append(new MyDiv()..text = 'Hello');
}

以上内容适用于Dartium或本机实现自定义元素规范的任何浏览器(例如Chrome 33+)。要在另一个浏览器中运行,您需要添加自定义元素polyfill。您可以将其添加到pubspec:

dependencies:
  custom_element: '>=0.9.0'
  ...

运行pub get后,您可以将填充脚本添加到html:

<body>    
  <script src="packages/custom_element/custom-elements.min.js"></script>
  ...
</body>