[TIL] 2023-05-16

Melon Coder·2023년 5월 16일
0

TIL

목록 보기
35/50
post-thumbnail

Today I Learned


[Solidity]

오늘은 컨트랙트에서 상속하는 법과 함수의 접근 범위를 결정하는 가시성, 그리고 네번째 퀴즈를 풀었다.


Inheritance

  • 상속은 여러 컨트랙트를 상속받을 수도 있고 단일 컨트랙트를 상속받을 수도 있다.
contract DAD {
    function dad() virtual public pure returns(string memory) {
        return "dad from DAD";
    }
}

contract MOM {
    function mom() public pure returns(string memory) {
        return "mom from MOM";
    }
}

contract CHILD2 is DAD, MOM {
    function child() public pure returns(string memory) {
        return "child from CHILD";
    }
}

  • virtual, override로 컨트랙트 사이에 특정 함수를 상속받아 사용할 수도 있다.
contract DAD {
    function dad() virtual public pure returns(string memory) {
        return "dad from DAD";
    }
}

contract CHILD3 is DAD {
    function child() public pure returns(string memory) {
        return "child from CHILD";
    }

    function dad() override public pure returns(string memory) {
        return "dad from CHILD";
    }
}

  • 상속받은 컨트랙트의 또 상속을 받을수 있다.
contract DAD {
    function dad() public pure returns(string memory) {
        return "dad from DAD";
    }
}

contract MOM {
    function mom() public pure returns(string memory) {
        return "mom from MOM";
    }
}

contract CHILD2 is DAD, MOM {
    function child() public pure returns(string memory) {
        return "child from CHILD";
    }
}

contract GRANDCHILD is CHILD2 {
    function grandChild() public pure returns(string memory) {
        return "grandChild";
    }
}

  • 대신에 상속을 받아서 입력값이 바뀌면 상속이 불가능하다.

  • overridevirtual을 동시에 사용할 수도 있다.(상속을 받고 상속을 해줄 때)
contract DAD {
    function who() virtual public pure returns(string memory) {
        return "dad from DAD";
    }
}

contract MOM {
    function who() virtual public pure returns(string memory) {
        return "mom from MOM";
    }
}

contract CHILD2 is DAD, MOM {
    function who() virtual override(DAD, MOM) public pure returns(string memory) {
        return "child from CHILD";
    }
}

contract GRANDCHILD is CHILD2 {
    function who() override public pure returns(string memory) {
        return "grandChild";
    }
}

  • 상속 순서에 따라 상속받은 함수가 바뀐다.(제일 뒤에 있는 컨트랙트를 상속함)
contract CHILD2 is DAD, MOM { // MOM 상속
    function who() override(DAD, MOM) public pure returns(string memory) {
        return super.who();
    }
}

contract CHILD2_2 is MOM, DAD { // DAD 상속
    function who() override(DAD, MOM) public pure returns(string memory) {
        return super.who();
    }
}

  • 상속받은 컨트랙트로 부터 함수가 external, private일 경우 오류가 발생한다. internal, public은 가능.

  • 새로운 인스턴스를 생성하고 husband라는 변수를 할당한다. new머클패트리샤트라이에서 새로운 리프 노드를 만든다고 보면 된다.
contract MOM {

DAD husband = new DAD();
  • DAD 컨트랙트는 다음과 같다.
contract DAD {
    uint public wallet=100;
    uint internal crypto=1000;
    uint private emergency=10000;
  • 이때 MOM 컨트랙트에서 DAD에 있는 변수를 불러올 때 public 변수만 가져올 수 있다.(internal, private는 가져오기 불가능), (external 변수는 선언이 불가능하고 함수에서만 가능함)

  • 가시성 없이 변수 선언하면 디폴트값은 internal임.

  • 즉 상속을 받아서 internal 변수를 사용하려면 컨트랙트에 상속(ex. contract MOM is DAD{})해주고 새로운 인스턴스를 선언해서 사용하려면 public만 가능.

0개의 댓글