📜  Solidity-继承(1)

📅  最后修改于: 2023-12-03 15:20:11.058000             🧑  作者: Mango

Solidity-继承

在 Solidity 中,继承是一种让一个合约从另一个合约获取代码的方式。继承可以使合约更加模块化,有了继承,可以把一些公共的代码放在一个合约里面,让其他合约来继承这个合约,从而避免重复代码和重复的工作。

继承的基本语法

使用 is 声明继承关系,如下所示:

contract Base {
    // 父合约的代码
}

contract Derived is Base {
    // 子合约的代码
}

在这个例子中,Derived 是从 Base 合约继承而来的。

覆盖继承方法

子合约可以覆盖父合约的方法,如下所示:

contract Base {
    function hello() public pure returns(string memory) {
        return "hello";
    }
}

contract Derived is Base {
    function hello() public pure returns(string memory) {
        return "hi";
    }
}

在这个例子中,Derived 合约中的 hello 方法覆盖了 Base 合约中的 hello 方法。当在 Derived 合约中调用 hello 方法时,将返回字符串 "hi"

访问父合约的方法和数据成员

使用 super 关键字可以访问父合约的方法和数据成员,如下所示:

contract Base {
    uint public variable = 123;

    function getVariable() public view returns(uint) {
        return variable;
    }
}

contract Derived is Base {
    function getVariable() public view returns(uint) {
        uint baseVariable = super.getVariable();
        return baseVariable + 456;
    }
}

在这个例子中,Derived 合约中的 getVariable 方法通过调用 super.getVariable() 来访问父合约的 getVariable 方法,并对父合约的返回值进行修改,在返回之前加上了 456。当在 Derived 合约中调用 getVariable 方法时,将返回 579

多重继承

Solidity 支持多重继承,一个合约可以继承多个合约,如下所示:

contract A {
    function a() public pure returns(string memory) {
        return "A";
    }
}

contract B {
    function b() public pure returns(string memory) {
        return "B";
    }
}

contract C is A, B {
    function c() public pure returns(string memory) {
        return "C";
    }
}

在这个例子中,C 合约从 AB 两个合约继承了方法,C 合约中有三个方法 abc

引用其它合约

可以使用 import 关键字引用其它合约的代码,如下所示:

import "./Base.sol";

contract Derived is Base {
    // Derived 合约的代码
}

在这个例子中,Derived 合约引用了 Base.sol 文件中的代码,Base 合约变成了 Derived 合约的父合约。

总结

继承是 Solidity 中实现代码重用的一种重要机制,可以避免重复代码和重复的工作,使合约更加模块化和易于维护。继承的基本语法使用 is 关键字声明继承关系,在子合约中可以覆盖父合约的方法和访问父合约的方法和数据成员。Solidity 支持多重继承,可以从多个合约中获取代码。可以使用 import 关键字引用其它合约的代码。