fullstack

[Solidity] 상속, 다중상속, 함수 오버라이드(override)

Web3/Solidity

Solidity의 contract는 객체지향언어에서의 class와 닮은 점이 많습니다

그 중 상속에 대해서도 매우 유사한 형태를 보입니다

 

상속

상속은 다음과 같이 사용하면 됩니다

contract Doge {
  function catchphrase() public returns (string) {
    return "So Wow CryptoDoge";
  }
}

contract BabyDoge is Doge {
  function anotherCatchphrase() public returns (string) {
    return "Such Moon BabyDoge";
  }
}

contract 이름 뒤에 is 키워드를 이용하여 뒤에 상속받을 부모 contract의 이름을 써주면 됩니다

그럼 자식 contract는 상속받은 부모 contract의 모든 public 변수와 함수에 접근이 가능합니다

 

다중 상속

다중상속은 다음과 같이 사용하면 됩니다

contract MomDoge {
  function catchphrase() public returns (string) {
    return "So Wow CryptoDoge";
  }
}

contract DadDoge {
  function catchphrase() public returns (string) {
    return "So Wow CryptoDoge";
  }
}

contract BabyDoge is MomDoge, DadDoge {
  function anotherCatchphrase() public returns (string) {
    return "Such Moon BabyDoge";
  }
}

이미 상속받은 부모 contract가 있다면 뒤에 ','를 붙여 구분하여 다중상속을 할 수 있습니다

 

함수 오버라이드

상속을 받으면 부모의 public함수에 접근이 가능합니다

이때 부모의 함수의 이름과 같은 이름과 매개변수를 사용하여 함수를 재정의 하고 싶을 때가 있습니다

이를 함수 오버라이드(Override)라고 합니다

 

기본적인 단일상속에서는 다음과 같이 사용하면 됩니다

contract MomDoge {
  function catchphrase() public virtual returns (string) {
    return "So Wow CryptoDoge";
  }
}

contract BabyDoge is MomDoge {
  function catchphrase() public override returns (string) {
    return "Such Moon BabyDoge";
  }
}

부모 contract의 함수에서는 virtual을 자식 contract의 함수에서는 override를 명시해 주면 됩니다

 

만약 다중상속이고 오버라이드 하려는 함수가 여러 부모가 가지고 있는 함수라면

다음과 같이 괄호를 사용하여 해당 함수를 가진 contract들을 명시해 주어야 합니다

 

contract MomDoge {
  function catchphrase() public virtual returns (string) {
    return "So Wow CryptoDoge";
  }
}

contract DadDoge {
  function catchphrase() public virtual returns (string) {
    return "So Wow CryptoDoge";
  }
}

contract BabyDoge is MomDoge, DadDoge {
  function catchphrase() public override(MomDoge, DadDoge) returns (string) {
    return "Such Moon BabyDoge";
  }
}