Solidity

如何禁用父契約中的功能?

  • September 23, 2019

假設我有這份契約:

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");
}

希望能幫助到你。

引用自:https://ethereum.stackexchange.com/questions/76176