상세 컨텐츠

본문 제목

솔리디티 강좌 12강 상속3 - 두개 이상 상속하기

솔리디티 깨부수기 - 기본

by D_One 2021. 9. 8. 16:26

본문

 

안녕하세요, 

오늘은 두개 이상 상속할 때 어떻게 해야 하는지에 대해서 알아 보겠습니다.

 

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


contract Father{
}

contract Mother{
}


contract Son{
}

저희에게는 Father, Mother, Son 컨트랙이 있습니다. 

아들컨트랙은 아버지와 어머니 컨트랙에게 기능을 상속 받을 것입니다. 

 

상속 받기는 매우 간단합니다. 

저희가 이전에 봤던 is 를 써주면 된답니다.

 

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


contract Father{
}

contract Mother{
}


contract Son is Father,Mother{
}

이렇게 써줌으로써 저희는 Father, Mother 컨트랙이 Son 컨트랙에 상속됨을 볼 수 가 있습니다. 

 

만약에, Father, Mother 컨트랙에 같은 이름의 함수가 있다면 어떻게 될까요?

 

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


contract Father{
    uint256 public fatherMoney = 100;
    function getFatherName() public pure returns(string memory){
        return "KimJung";
    }
    
    function getMoney() public view returns(uint256){
        return fatherMoney;
    }
    
}

contract Mother{
    uint256 public motherMoney = 500;
    function getMotherName() public  pure returns(string memory){
        return "Leesol";
    }
    function getMoney() public view returns(uint256){
        return motherMoney;
    }
}


contract Son is Father, Mother {

}

 

먼저, Father 과 Mother 컨트랙 두개를 보면, 매우 유사합니다.

getFatherName 과 getMotherName 은 아버지와 어머니 이름을 리턴하는 함수입니다.

그리고, getMoeny라는 같은 이름의 함수가 Father , Mother 컨트랙에 각각 들어 있답니다.

 

이럴경우, Son 컨트랙이 Father과 Mother 컨트랙을 상속 받는다면 에러가 발생하고, override 하라고 명시하라고 에러가 뜹니다. 그렇기에, 저희는 이 똑같은 이름의 함수 getMoeny 를 가진 두개의 다른 Father, Mother 스마트컨트랙에, getMoeny 부분에 virtual 이라고 명시를 해줄것입니다.

 

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


contract Father{
    .....
    
    function getMoney() public view virtual returns(uint256){
        return fatherMoney;
    }
    
}

contract Mother{
   ....
   
    function getMoney() public view virtual returns(uint256){
        return motherMoney;
    }
}


contract Son is Father, Mother {

}

그러면 위와 같이 되겠죠. 

 

그담에 Son 컨트랙에 override를 해주어야 하잖아요.

보통의 경우, 그냥 override만 명시를 해주었잖아요 이번에는 overrride (Father,Mother) 을 써줘야합니다.

즉 이런식으로 override ( 중복이름의 함수를 가진 스마트 컨트랙 명시)  해줘야합니다.

 

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


contract Father{
    uint256 public fatherMoney = 100;
    function getFatherName() public pure returns(string memory){
        return "KimJung";
    }
    
    function getMoney() public view virtual returns(uint256){
        return fatherMoney;
    }
    
}

contract Mother{
    uint256 public motherMoney = 500;
    function getMotherName() public  pure returns(string memory){
        return "Leesol";
    }
    function getMoney() public view virtual returns(uint256){
        return motherMoney;
    }
}


contract Son is Father, Mother {

    function getMoney() public view override(Father,Mother) returns(uint256){
        return fatherMoney+motherMoney;
    }
}

 

그러면 위와 같이 됨을 알수가있죠.

 

영상을 꼭 참고하시기 바랍니다.

관련글 더보기