스마트 컨트랙트 내에서 상속이란, 재산이나 권리를 주는 것이 아닌, 변수와 함수들을 넘겨주는 것.

// SPDX-License-Identifier:GPL-30
pragma solidity >=0.7.0 <0.9.0;

contract Father {}

contract Son {}

예를 들어, Father, Son 두 개의 부자 관계 컨트랙트가 있을 경우, Father 컨트랙트에 기능을 구현 후 Son 컨트랙트가 기능을 상속 받도록 구현함.

// SPDX-License-Identifier:GPL-30
pragma solidity >=0.7.0 <0.9.0;

contract Father {
    string public familyName = "Lee";
    string public givenName = "MinSang";
    uint256 public money = 100;

    function getFamilyName() public view returns (string memory) {
        return familyName;
    }

    function getGivenName() public view returns (string memory) {
        return givenName;
    }

    function getMoney() public view returns (uint256) {
        return money;
    }
}

Father 컨트랙트에는 3개의 변수, 함수가 있음.

이 3개의 변수와 함수를 Son 컨트랙트에서 상속 받아, 접근 해보려고 함.

상속받을컨트랙트 is 상속해주는컨트랙트 {}
// SPDX-License-Identifier:GPL-30
pragma solidity >=0.7.0 <0.9.0;

contract Father {
    string public familyName = "Lee";
    string public givenName = "MinSang";
    uint256 public money = 100;

    function getFamilyName() public view returns (string memory) {
        return familyName;
    }

    function getGivenName() public view returns (string memory) {
        return givenName;
    }

    function getMoney() public view returns (uint256) {
        return money;
    }
}

contract Son is Father {}

Son 컨트랙트가 상속을 받아 모두 받아 사용 가능함을 볼 수가 있음.

스크린샷 2024-01-24 오후 6.43.34.png

Father에 constructor가 있다면?

// SPDX-License-Identifier:GPL-30
pragma solidity >=0.7.0 <0.9.0;

contract Father {
    string public familyName = "Lee";
    string public givenName = "MinSang";
    uint256 public money = 100;

    constructor(string memory _givenName) {
        givenName = _givenName;
    }

    function getFamilyName() public view returns (string memory) {
        return familyName;
    }

    function getGivenName() public view returns (string memory) {
        return givenName;
    }

    function getMoney() public view returns (uint256) {
        return money;
    }
}

위 생성자는 givenName을 변경시켜 줌.

Son이 Father의 것을 상속받는다 하여도, 이름은 다르기 때문에 생성자를 통해 이름을 다르게 지정할 수 있음.

// SPDX-License-Identifier:GPL-30
pragma solidity >=0.7.0 <0.9.0;

contract Father {
    string public familyName = "Lee";
    string public givenName = "MinSang";
    uint256 public money = 100;

    constructor(string memory _givenName) {
        givenName = _givenName;
    }

    function getFamilyName() public view returns (string memory) {
        return familyName;
    }

    function getGivenName() public view returns (string memory) {
        return givenName;
    }

    function getMoney() public view returns (uint256) {
        return money;
    }
}

contract Son is Father("SeongHyun") {}

위 예제와 같이

상속받을컨트랙트 is 상속해주는컨트랙트(파라미터) {}