А дали е така :) ... Inheritance question poped up during "Inheritance and multiple contracts" lecture
По време на лекцията остана неотговорен въпросът защо в примерът "multiple_inheritance_advanced.sol" ако променим контракт s6 заменяйки "super.test(); " с "s1..test();" поведението не е според очакванията.
Мисля че заради правилата на наследяване, в така написаните контракти в s6 полето "а" от s2 скрива(shadow) полето "а" от s1.
T.e. : s6.a == s2.a != s1.a.
Или иначе казано функцията test() на s1 модифицира полето "а" на s1, а s6.a е друга различна променлива и тя остава немодифицирана.
Това се доказва лесно със промените показани по-долу.
Има и друго доказвне. Ако в s6.test() напишем string b = s1(this).a; компилаторът много плаче и причината е че s1.a e невидимо от s6.
contract s1
{
string public a;
function getA() public returns (string memory) { return a;}
function test() public { a = "s1"; }
}
contract s6 is s1, s2, s3, s5
{
function test() public
{
s1.test();
a = s1(this).getA(); // Изрично вземаме а от s1 и го присвояваме на а от s6.
}
}