我正在研究锡兰,对它的元模型有疑问。我想创建一些基类'DataContainer‘,它允许使用内置的等于散列实现实例化不可变的类:例如标识符(125,"ab") ==标识符(125,"ab"),因此基类应该收集所有共享的非变量值,并在“hash”和“equals”方法中使用这些信息。我写了下面的代码:
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的客户端。总的来说,我喜欢这个解决方案,但我必须将' class‘传递给超类构造函数,因为如果我在DataContainer中使用'class’,它看不到任何子类的成员。如何在基类方法中获取扩展类成员的实际列表?像“这个”这样的东西不起作用。
https://stackoverflow.com/questions/47561579
复制相似问题