我正在研究锡兰并对它的元模型有疑问。我想创建一些创建一些基类'DataContainer',它允许使用内置的equals-hash实现实例化不可变类:例如Identifier(125,“ab”)== Identifier(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'这样的东西不起作用......