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”关键字。我只是在学习飞镖,我仍然期待着有一天我会发现不同:——)