【发布时间】:2017-11-29 20:49:40
【问题描述】:
我正在研究 Ceylon 并且对元模型有疑问。我想创建一些创建一些基类'DataContainer',它允许使用内置的equals-hash实现实例化不可变类: 例如标识符(125,“ab”)==标识符(125,“ab”) 所以基类应该收集所有共享的非变量值,并在“散列”和“等于”方法中使用这些信息。 我写了这段代码:
shared abstract class DataContainer(ClassDeclaration declaration) {
value members = {
for (i in declaration.memberDeclarations<ValueDeclaration>())
if (!i.variable, i.name != "hash", i.name != "string") i
};
variable Integer? hashCode = null;
shared actual Boolean equals(Object that) {
if (is DataContainer that) {
for (item in members) {
value thisMember = item.memberGet(this);
value thatMember = item.memberGet(that);
if (exists thisMember, exists thatMember) {
if (thisMember != thatMember) { return false; }
} else if (thisMember exists != thatMember exists) { return false; }
}
return true;
}
return false;
}
shared actual Integer hash => hashCode else (hashCode = calculateHash());
Integer calculateHash() {
variable value result = 0;
for(i in members) {
if (exists member = i.memberGet(this)) {
result = result.xor(member.hash);
}
}
return result;
}
}
class Identifier(shared Integer? id, shared String? name) extends DataContainer(`class`) {}
Identifier 类是 DataContainer 的客户端。我整体上喜欢这个解决方案,但我必须将“类”传递给超类构造函数,因为如果我在 DataContainer 中使用“类”,它就看不到任何子类的成员。 如何在基类方法中获取扩展类成员的实际列表? 像'this'这样的东西不起作用......
【问题讨论】:
标签: reflection metamodel ceylon