首页 文章

Dart:使用抽象类扩展HTMLElement

提问于
浏览
3

我试图用以下设计模式写一些东西:

void main() 
{
    document.registerElement('abs-test', Test);
    TestExtend test = new TestExtend();
    document.body.append(test);
}

abstract class Test extends HtmlElement
{
    Test.created() : super.created();
    factory Test() => new Element.tag('abs-test')..text = "test";
}

class RedTest extends Test
{
    TestExtend() : super() => style.color = 'red';  
}

我的目的是创建一个注册到抽象类“Test”的自定义HtmlElement . 这个抽象类“Test”将具有一些属性,Test的所有元素都需要具有这些属性 . 在此示例中,Test类型的所有元素都需要将“test”作为其文本 .

但是,我希望只允许用户使用更具体的属性创建“Test”的子类 . 在这个例子中,我们有RedTest,然后将Test的颜色设置为红色 . 生成的HTML将是:

<abs-test style="color:red;">test</abs-test>

我有2个问题:

1)是否可以调用父类的工厂构造函数? (如果没有,是否可以以不同的方式扩展HtmlElement,不需要工厂构造函数)

2)是否可以使用抽象类扩展HtmlElement?

我已经用不同的构造函数测试了一段时间,但我无法使其工作 . 有人可以建议吗?

1 回答

  • 2

    您使用类注册标记,以便浏览器可以为您实例化它 . 如果这不是1:1关系,则浏览器无法知道要实例化的类 .

    因此

    你需要

    • 每个类的不同标记

    • 使用具体(非抽象)类注册每个标记

    您通常可以在抽象类的工厂构造函数中调用子类的构造函数

    factory Test() => new RedTest()..text = "test";
    

    在Dart中有效,但因为扩展元素需要返回

    new Element.tag('abs-test')
    

    这不起作用,因为你不能同时返回两者 .

    您需要使用不同的标记注册每个具体子类

    document.registerElement('abs-test-red', TestRed);
    document.registerElement('abs-test-blue', TestBlue);
    

相关问题