Solidity
通過繼承覆蓋常量變數:為什麼父變數只在子函式中被覆蓋?
假設我有以下兩個契約
Hello
,並且Goodbye
, 和Goodbye
繼承自Hello
. 兩者都聲明了一個常量變數aString
,即子合約Goodbye
覆蓋了父合約的值:pragma solidity ^0.4.17; contract Hello { // This will be overwritten by child string public constant aString = 'Hello World!'; // Prints Hello World function printMe() returns (string){ return aString; } } contract Goodbye is Hello{ // Overwrites `aString` of parent string public constant aString = 'Goodbye World!'; // Why does this print Hello World, too??? function printMe() returns (string){ return super.printMe(); } // Prints Goodbye World as expected function printMe2() returns (string){ return aString; } }
因此,如果我呼叫
printMe()
契約Hello
,它會'Hello World!'
按預期返回。此外,如果我創建契約
Goodbye
並呼叫它的函式printMe2()
,它會返回'Goodbye World!'
,因為它aString
覆蓋了父級的'Hello World!'
. 但是printMe()
,如果呼叫Goodbye
which 又呼叫super.printMe()
它返回'Hello World!'
?為什麼
printMe()
in不Goodbye
回來'Goodbye World!'
?為什麼呼叫忽略了 byaString
的覆蓋?Goodbye``super.printMet()
好吧,你自己說,你不是在打電話
aString
,而是super.printMe()
。
super
對這裡有更深入的解釋:Solidity 中的 super 關鍵字可以訪問派生目前合約的直接父合約。
您正在明確呼叫父合約 Hello,其中
aString
是'Hello, world.'
看看你輸入的區別
printMe2()
:返回超.aString;