Class 什么是;对超级构造函数的未解析隐式调用;用飞镖的语言是什么意思?

Class 什么是;对超级构造函数的未解析隐式调用;用飞镖的语言是什么意思?,class,inheritance,dart,Class,Inheritance,Dart,为什么会出现这个例子: 导入“dart:html”; 类subnumelement扩展了DivElement{ 子元素(){ 打印(“我创建的元素”); } } 给出了错误: Internal error: 'file.dart': error: line x pos y: unresolved implicit call to super constructor 'DivElement()' SubMenuElement() { ^ 错误消息的含

为什么会出现这个例子:

导入“dart:html”;
类subnumelement扩展了DivElement{
子元素(){
打印(“我创建的元素”);
}
}
给出了错误:

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

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

DivElement没有默认构造函数。 您需要在super上添加一个命名构造函数和对命名构造函数的调用

subnumelement.created():super.created();
如果派生DOM元素,则应使用Polymer添加

导入'dart:html';
进口“包装:聚合物/聚合物.dart”;
类subnumelement使用聚合物扩展DivElement{
subnumelement.created():super.created();
}

您没有声明要创建聚合元素,但只能对聚合使用自定义元素,因此我假设您可以这样做。

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

也就是说,DivElement不能直接子类化。但您可以通过实现DivElement来模拟这种行为,而不是扩展它并委派每个调用:

类MyDivElement实现了DivElement{ DivElement_代表; MyDivElement(){ _delegate=新的DivElement(); //构造函数中应该发生的任何事情 } //为了获得最佳性能,应该显式地实现每个成员。 字符串get text=>\u delegate.text; Node get parentNode=>\u delegate.parentNode; ShadowRoot get ShadowRoot=>_delegate.ShadowRoot; //但是DivElement有很多成员。 //未使用或很少使用的成员也可以通过反射进行委派。 noSuchMethod(调用)=>reflect(_delegate).delegate(调用); }
您可以声明DivElement的子类,如下所示:

导入'dart:html';
类MyDiv扩展了DivElement{
工厂MyDiv()=>新元素.tag('div','MyDiv');
MyDiv.created():super.created();
}
工厂构造器不是必需的,但是如果您想要强制构造实例,它是很方便的

然后,必须在文档中注册自定义元素,然后才能对其进行实例化:

main(){
文件注册表('my-div',MyDiv,extendsTag:'div');
append(新的MyDiv()…text='Hello');
}
上述内容适用于Dartium或任何本机实现自定义元素规范的浏览器(例如Chrome 33+)。若要在其他浏览器中运行,需要添加自定义图元polyfill。您可以将其添加到pubspec中:

依赖项:
自定义_元素:'>=0.9.0'
...
运行
pub-get
后,您可以将polyfill脚本添加到html中:


...

不起作用。对你有用吗?如果是这样的话,你介意分享代码吗?我不使用polymer.AFAIK,但是没有办法使用从DOM元素类派生的自定义类。DivElement不是Dart类。它只是到浏览器本机类的映射。这导致了限制。我按照上面的建议进行了尝试,DartEditor不再显示警告,但当我运行应用程序时,Dartium崩溃了。
DivElement.created()
构造函数上的文档还声明
在创建自定义元素时,构造函数由DOM实例化,因此用户代码不会调用它。如上所述,您只能使用聚合物和自定义元素扩展元素。您认为与使用聚合物相比,您的解决方案的优势是什么?我想如果你想声明性地添加它,你还必须使用
自定义元素polyfill是polymer的一部分。但是定制元素正在成为标准web平台的一部分,Chromium/Dartium已经实现了该规范,因此您可能不需要polyfill,这取决于您的用例。你也可以使用
Ahoy声明式,继续并将其添加到示例中的html中,您将看到它可以工作:)谢谢。它提醒我必须使用“implements”,而不是我一直认为是子类的“extends”关键字。我只是在学习飞镖,我仍然期待着有一天我会发现不同:——)