Modifiers
覆蓋父方法和修飾符
例如,我們有一個契約:
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; } }