Предположим, у меня есть следующие два контракта 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!'
? Почему перезапись aString
by Goodbye
игнорируется super.printMet()
вызовом?
Ты ж сам скажи, ты не звонишь aString
, а super.printMe()
.
Получите более глубокое объяснение super
здесь :
Ключевое слово super в Solidity дает доступ к непосредственному родительскому контракту, из которого получен текущий контракт.
Вы явно вызываете родительский контракт Hello, в aString
котором'Hello, world.'
Посмотрите на разницу, если printMe2()
вставить:
вернуть супер.aString;