Перезапись постоянных переменных путем наследования: почему родительские переменные перезаписываются только в функциях дочерних?

Предположим, у меня есть следующие два контракта 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, в свою очередь, вызывает super.printMe()его , возвращается 'Hello World!' ?

ПочемуprintMe() in не Goodbye возвращается 'Goodbye World!' ? Почему перезапись aStringby Goodbyeигнорируется super.printMet()вызовом?

Ответы (1)

Ты ж сам скажи, ты не звонишь aString, а super.printMe().

Получите более глубокое объяснение superздесь :

Ключевое слово super в Solidity дает доступ к непосредственному родительскому контракту, из которого получен текущий контракт.

Вы явно вызываете родительский контракт Hello, в aStringкотором'Hello, world.'

Посмотрите на разницу, если printMe2()вставить:

вернуть супер.aString;