상속 (Inheritance)
- 상속이란?
- 오버라이드 (Override)
상속이란?
Solidity는 다중 상속과 다형성을 지원하는 언어입니다. 그중에 상속을 설명을 드리자면 상속을 받는 컨트랙터를 자식 컨트랙트, 상속을 해주는 컨트랙트를 부모 컨트랙트라고 합니다. 이때 부모 컨트랙트는 private를 제외한 모든 변수나 함수를 상속해 줍니다.
contract Parent {
uint a = 3;
uint public b = 6;
function add(uint _first, uint _second) returns(uint){
return _first + _second ;
}
}
contract Child is Parent {
function add1() public returns(uint){
return a + b;
}
}
상속을 선언하는 방법은 위와 같이 is를 이용합니다. is 앞에는 상속을 받을 자식 컨트랙트 이름이 오고 is 뒤에는 부모 컨트랙트의 이름이 오게 됩니다. 위의 예시의 경우 Child 자식 컨트랙트에 a와 b가 선언되지 않았지만 부모 컨트랙트에서 선언이 된 a와 b를 상속받았으므로 결과는 9가 나옵니다. 또 a는 public으로 선언을 하지 않았지만 상속이 된 것을 알 수 있습니다.
오버라이드 (Override)
상속을 하는 경우 자식 컨트랙트에 부모 컨트랙트와 같은 이름을 가진 함수들이 있는 경우도 있습니다. 덮어 쓰이는 경우가 있습니다. 덮어 쓰이는 경우를 오버라이드 (Override)라고 부릅니다. 오버라이드가 되려면 함수 명, 입력 매개 변수, 출력 매개 변수 모두 같아야 합니다. 또한 virtual과 override를 명시하여야 합니다.
contract Mom {
uint a = 5;
uint b= 10;
function f() view public virtual returns(uint){
return a+b;
}
}
contract Child1 is Mom {
function f() view public override returns(uint){
return a*b;
}
}
위와 같은 방법으로 오버라이드를 할 수 있습니다. 자식 컨트랙트를 실행하면 덮어쓰게 되므로 a+b의 작동이 되지 않고 a*b가 작동되어 50이라는 결과 값이 나오게 됩니다.
contract Mom {
uint a = 5;
function f() view public virtual returns(uint){
return a*2;
}
}
contract Dad {
uint b= 10;
function f() view public virtual returns(uint){
return b*3;
}
}
contract Son is Dad,Mom {
function f() view public override(Dad,Mom) returns(uint){
return a+b;
}
}
위의 경우는 다중 상속을 받는 경우 오버라이드를 하는 방법입니다. Mom컨트랙트와 Dad컨트랙트에 같은 이름의 함수가 존재하여 자식 컨트랙트에서 오버라이드 할 경우 오버라이드 옆에 괄호를 통하여 어떠한 것을 오버라이드 하는 것인지 표시를 해주면 오버라이드가 가능합니다. 위의 예시에서 자식 컨트랙트의 결과는 15가 나옵니다.