А дали е така :) ... 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.
    }
}