Ethereum Solidity和Cryptozombies中的内在性:如何部署完整的OOP树?

Ethereum Solidity和Cryptozombies中的内在性:如何部署完整的OOP树?,ethereum,solidity,smartcontracts,Ethereum,Solidity,Smartcontracts,我正在学习加密僵尸教程,遇到了一个概念上的障碍。“僵尸工厂”契约似乎是一个单例契约,它包含我们假设的cryptozombies游戏的全局状态,它包含在一些数组和映射中,但我不清楚在部署时,所有子契约是否都指向同一个注册表,而无需做一些额外的工作 子合同通常指其父合同(即ZombieFactory)中持有的状态,至少在加密僵尸的上下文中,该状态似乎被假定为单例。这与我的OOP概念模型不一致,在OOP中,子类的每个实例化都包含其所有状态的闭包(包括其父类中声明的状态变量)。似乎(在没有仔细部署的情况

我正在学习加密僵尸教程,遇到了一个概念上的障碍。“僵尸工厂”契约似乎是一个单例契约,它包含我们假设的cryptozombies游戏的全局状态,它包含在一些数组和映射中,但我不清楚在部署时,所有子契约是否都指向同一个注册表,而无需做一些额外的工作

子合同通常指其父合同(即ZombieFactory)中持有的状态,至少在加密僵尸的上下文中,该状态似乎被假定为单例。这与我的OOP概念模型不一致,在OOP中,子类的每个实例化都包含其所有状态的闭包(包括其父类中声明的状态变量)。似乎(在没有仔细部署的情况下),在OOP层次结构(尤其是当层次结构是树而不是链表时)中部署多个连接的契约可能会有问题。我如何知道我没有每次声明不同的实例


在这种情况下,我如何确保以问题第一部分所述的方式部署契约?是否需要在字段中保留父合同的地址?

实际上只需要部署最后一个类。假设您有一个A,它是B的父级,B是C的父级。然后您将C部署到网络,但您也将提供A和B的源代码,因此编译器将A、B和C类编译成一个字节码块,并将其上载到网络。因此,您将只有一个合同实例,其中包含a、B和C的所有方法/字段。 可以将契约作为单独的实例上传,但它们是库,通过组合而不是继承使用。
希望有帮助。

明白了。如果我希望所有子项都从同一个单例父契约(也称为共享状态)继承,那么我应该将该父项用作库?@ashissl是EVM中没有状态的契约,因此它不适用于您。如果要在多个合约之间共享状态。你必须建立一个拥有状态的主契约,并且所有子契约都应该使用接口与之交互。本质上,组合优先于继承。明白了!谢谢出于某种原因,我假设cryptozombies教程中的类层次结构是一棵树,而实际上它是一个链表。在这种情况下,使用继承(并且只使用部署层次结构中最低的对象一次)仍然是违反约定的。继承使用是绝对正常的,事实上,它是最常见的方法。只需部署您的目标类,它将拥有所有功能和单一状态。