今天來聊聊關於 contracts 的繼承

關於 contracts 其實它是支援多重繼承,在這方面上是跟 python 是一樣的,它是透過關鍵字 is 來選擇要繼承的對象。我們看看下面的範例

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.3;

// 這是父層的合約
contract A {
    function Name() public pure virtual returns (string memory) {
        return "A";
    }
}

//透過 is 的關鍵字 B 繼承 A ,然後透過 ovverride 複寫 Name()
contract B is A {
    function Name() public pure virtual override returns (string memory) {
        return "B";
    }
}

//跟上面一樣 複寫 Name()
contract C is A {
    function Name() public pure virtual override returns (string memory) {
        return "C";
    }
}

// 這個合約繼承 B 跟 C ,但合約繼承會從右邊為繼承,所以它的 override裏面的對象,會針對c 也就是它的 super 層會回覆 c

contract D is B, C {
    //會回覆"C"
    function Name() public pure override(B, C) returns (string memory) {
        return super.foo();
    }
}

再來我們聊聊抽象合約,其實 solidity,有一個抽象合約的規格,我們看看下面範例

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.3;
// 這是抽象合約
abstract contract A {
    function Name() public pure virtual returns (string memory);
}
contract B is A {
    function Name() public pure override returns (string memory) {
        return "B";

    }
}

既然有 abstruct ,那就一定有 interface ,明天我們就來聊聊 interface。