상속 정의하는 법에 따라, 상속받은 함수를 다르게 변경할 수도 있는데,
오버라이딩, 즉 상속받은 함수를 덮어쓰기라고 생각할 수 있음
// 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") {}
여기서 getMoney()
메서드를 오버라이딩 해보려고 합니다.
Son 컨트랙트가 Father 컨트랙트에 돈 100만원을 상속 받는다고 가정할 때,
Son 컨트랙트가 100만원을 저금하고, 혹은 일을 하면 월급을 또 저금함으로써 돈이 증가할 수 있기 때문입니다.
오버라이딩을 하기 위해서는 오버라이딩할 함수에 virtual
을 명시해주어야 합니다.
// Father Contract
function getMoney() public view virtual returns(uint256) {
return money;
}
// Son Contract
contract Son is Father("SeongHyun") {
uint256 public earning = 0;
function work() public {
earning += 100;
}
function getMoney() public view override returns(256) {
return money + earning;
}
}
getMoney를 보면 override를 볼 수 있는데, 이를 명시함으로 우리는 함수를 오버라이딩할 수 있게 됨.
즉, 함수 안의 내용들을 마음대로 바꿀 수 있다는 뜻.
안의 내용을 보면 기존의 내용과 다른데, money + earning;
으로 오버라이딩 됐음을 알 수 있음.