Solidity
如何禁用父契約中的功能?
假設我有這份契約:
contract Foo { uint256 public foo; function setFoo(uint256 _foo) public { foo = _foo; } function setFooToZero() public { foo = 0; } }
我想像這樣繼承它:
contract Bar is Foo { function setFooToZero() public {} }
這樣,
setFooToZero
更新為一個什麼都不做的函式,但有沒有辦法禁用它?根本沒有在合約的字節碼中?
子合約不能從父合約中“刪除”功能。它只能覆蓋它。
因此,您唯一能做的就是設置一些布爾標誌來禁用父函式中的功能,或者簡單地用您自己的實現覆蓋該功能。當然,沒有什麼能阻止某人在沒有你的技巧的情況下直接使用父合約,這樣他們就可以使用完整的父合約——除非這些函式被標記為
internal
.
不,但有點。
繼承 (Bar) 的合約致力於實現父 (Foo) 中定義的所有功能,因此您不能讓該功能消失。
正如您所發現的,函式可以被覆蓋。您還可以賦予函式
private
可見性,使子契約無法訪問它。你的空函式什麼都不做。它還將返回“成功”並允許呼叫者正常繼續。根據功能的目的,這要麼是可取的,要麼是不可取的。在大多數情況下,理想的做法是恢復。這是一個抽象的例子,所以抽象的指導。;-)
function setFooToZero() public { revert("disabled"); }
希望能幫助到你。