Solidity

通過繼承覆蓋常量變數:為什麼父變數只在子函式中被覆蓋?

  • September 25, 2017

假設我有以下兩個契約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(),如果呼叫Goodbyewhich 又呼叫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;

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