(Solidity)繼承:如何在基本契約中向結構添加附加屬性?
這是一個非常簡化的範例,但它當然也擴展到更複雜的合約,我只是還沒有找到一個優雅的解決方案。
contract Group { struct Person { uint age; bytes32 name; } mapping (address => Person) members; } contract RockBand { struct Musician { uint age; bytes32 name; bytes32 instrument; } mapping (address => Musician) members; } contract FootballClub { struct Player { uint age; bytes32 name; bytes32 position; } mapping (address => Player) members; }
現在對我來說,從 Group 中創建一個“庫”並在其他兩個契約中繼承它是有意義的。但是我還沒有找到一種方法來修改子契約中定義的結構。我能想到的最好的是:
contract Group { struct Person { uint age; bytes32 name; } mapping (address => Person) members; } contract RockBand is Group{ struct MusicianExtra { bytes32 instrument; } mapping (address => MusicianExtra) membersMusicianExtra; } contract FootballClub is Group{ struct PlayerExtra { bytes32 position; } mapping (address => PlayerExtra) membersFootbalExtra; }
這與上述功能相同,但它需要額外資訊的額外映射。此外,在更大的合約中它會變得混亂和混亂,如果你需要查看兩個映射而不是一個來獲取資訊,它可能效率較低。
我希望社區中的某個人對我有一些見解。
謝謝!:)
我明白你的目標是什麼,以及為什麼要奮鬥。總之,繼承不適用於這種方法。最基本的是結構和映射(等)永遠定義了儲存的佈局,所以它不是可以被子類擴展的東西。相反,子類需要按原樣處理儲存,而不是按它希望的那樣處理。我希望這是有道理的。
有不止一種方法可以解決這個問題,我想你可能有比頭腦中的例子更複雜的東西。這是一個總體構想。
考慮將所有常見元素隔離到 People 中,然後與更專業的類保持關係。有些人是樂隊成員,而樂隊成員總是人。我在 1:1 的基礎上使用單獨的數據儲存契約取得了一些成功。也就是說,每個實體(類)都有一個儲存合約。*在我看來,*儲存應該強制參照完整性。
另一種方法是使用鍵/值對的抽象儲存佈局。這是 Consensys 的 uPort 項目採用的。使用鍵/值對的優勢在於擴展文件佈局,使用更多欄位。這裡的一些實驗工作:https ://bitbucket.org/rhitchens2/soliditystoragepatterns/src/ec5997449f4d99a2357c3b134f8794a790660a59/GeneralizedCollection.sol?at=master&fileviewer=file-view-default 。佈局基本上是:
record key + field key refersTo value
.這兩種方法可以結合起來形成靈活的文件儲存,具有強制連接和“查找相關”的“肉和土豆”功能。generalizedCollection 解決了在可升級契約場景中升級類似模式的設計細節。
希望能幫助到你。