簡體   English   中英

Dart語言中“未解析的超級構造函數隱式調用”是什么意思?

[英]What does “unresolved implicit call to super constructor” mean in Dart Language?

怎么來這個例子:

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() {
                  ^

錯誤消息的含義是什么?工作示例如何?

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的自定義元素,所以我假設您這樣做。

錯誤消息表示默認構造函數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);

}

您可以聲明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之后,您可以將polyfill腳本添加到您的html:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM