Modifiers

覆蓋父方法和修飾符

  • September 27, 2017

例如,我們有一個契約:

contract A {

   modifier checkCaller() {
       require(msg.sender == 0x123);
       _;
   }

   function doSmth() checkCaller {}
}

我們製作子合約並覆蓋函式:

contract B is A {
   function doSmth() {
       super.doSmth();
       // ... do more
   }
}

我是否需要checkCaller在子契約中明確使用修飾符B?據我了解super.doSmth()會正確拋出。正確的?

是的,你是對的。


我注意到值得關注的一點是,即使使用“超級”,“父”合約的修飾符以及任何函式都被繼承覆蓋。

例如,呼叫test(0)B 通過並返回 10(而不是人們可能認為的 5),但在合約 A 上失敗。

pragma solidity ^0.4.15;

contract A {
   modifier only (uint test) {
       require(test > 5);
       _;
   }
   function test(uint test) public only(test) returns(uint) {
       return addSome(test);
   }
   function addSome(uint number) internal returns(uint) {
       return number + 5;
   }
}

contract B is A {
   modifier only (uint test) {
       require(test < 10);
       _;
   }
   function test(uint test) public only(test) returns(uint) {
       return super.test(test);
   }
   function addSome(uint number) internal returns(uint) {
       return number + 10;
   }
}

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