gpt4 book ai didi

dart - 创建构建界面

转载 作者:行者123 更新时间:2023-12-03 00:25:09 24 4
gpt4 key购买 nike

现在我有几次遇到这样的用例,我需要为类如何构造自身定义一个接口(interface)。一个这样的例子可能是,如果我想创建一个接口(interface)类来定义对象可以序列化和反序列化自身的接口(interface)(用于输入数据库、以 JSON 形式发送等)。你可能会写这样的东西:

abstract class Serializable {
String serialize();
Serializable unserialize(String serializedString);
}

但是现在你遇到了一个问题,因为 serialize() 正确地是一个实例方法,而 unserialize() 应该是一个静态方法(不可继承)或由接口(interface)强制执行)或构造函数(也是不可继承的)。

这留下了一种状态,即需要实现 Serialized 接口(interface)的类来定义 serialize() 方法,但无法要求这些类定义一个static unserialize() 方法或 Foo.fromSerializedString() 构造函数。

如果将 unserialize() 设置为实例方法,则反序列化实现类 Foo 将如下所示:

Foo foo = new Foo();
foo = foo.unserialize(serializedString);

这相当麻烦且丑陋。

我能想到的唯一其他选择是在 Serialized 接口(interface)中添加注释,很好地询问实现类定义适当的静态方法或构造函数,但是如果开发人员这样做,这显然很容易出错错过它也会影响代码完成。

那么,有没有更好的方法呢?是否有某种模式可以让您拥有一个接口(interface),强制实现类定义一种构造自身的方法,或者提供某种一般效果?

最佳答案

如果您想要继承保证,则必须使用实例方法。不过,通过使用反射,您可以做得比手动实例化更好一些。

abstract class Serializable {

static Serializable fromSerializedString(Type type, String serializedString) {
ClassMirror cm = reflectClass(type);
InstanceMirror im = cm.newInstance(const Symbol(''), []);
var obj = im.reflectee;
obj.unserialize(serializedString);
return obj;
}

String serialize();
void unserialize(String serializedString);
}

现在,如果有人实现了Serialized,他们将被迫提供一个反序列化方法:

class Foo implements Serializable {

@override
String serialize() {
// TODO: implement serialize
}

@override
void unserialize(String string) {
// TODO: implement unserialize
}
}

你可以像这样获得一个实例:

var foo = Serializable.fromSerializedString(Foo, 'someSerializedString');

这可能比手动方法更漂亮和自然,但请记住,它使用反射来解决所有可能带来的问题。

如果您决定使用静态方法和警告注释,那么提供自定义 Transformer 可能会有所帮助。它会扫描所有实现 Serialized 的类,并警告用户或停止构建,如果有任何类没有相应的静态反序列化方法或构造函数(类似于 Polymer 的工作方式)。这显然不会提供编辑器使用实例方法所能提供的即时反馈,但比文档中的简单注释更明显。

关于dart - 创建构建界面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27608933/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com