现实中的继承一般是指财产的继承。而与之相似的是文化上的传承,传承是“去其糟粕,取其精华”的。Solidity中的继承一般可以继承父合约中所有变量与方法,但如果需要限制的话,也可以通过封装好的修饰符进行继承权限的限制。
实验目的
1. 明白继承基本结构。
2. 了解继承中的重写
3. 知道继承中的封装权限。
实验要求
1. 查看示例1的代码。合约son继承合约father,请思考合约son是否能调用father里面的变量money与函数smoking?请编译部署son合约(注意在部署界面的CONTRACT那里切换为son合约),看看是否能成功调用getMoney与test函数。请你仿照合约son补充代码:合约father继承合约grandFather,合约father声明函数getGudong()以调用合约grandFather的变量gudong并返回;合约son声明函数LearningStudy()调用合约grandFatrher的函数study()并返回。
2. 查看示例1中的代码。请你将Son合约中重写的smoking方法注释去掉,然后编译查看重写是否成功。如果报错请根据提示进行修改。需改完后,重新编译部署,调用函数test,检查返回的值是否被重写。
3. ①查看示例2的代码。编译并部署合约Son,调用函数getMoney,查看父合约被public修饰的变量Money子合约是否可以调用。然后注释掉被public修饰的Money,依次测试internal,priavte,external修饰的Money。请你找出哪些是不能修饰变量属性的?它们在父合约修饰的变量,在子合约中是否可调用?
②请你将合约Son中的函数test的注释去掉。修改该函数的方法体,使之成功调用父合约被external修饰的noSmoking函数。如果父合约Father不想子合约继承它的方法noSmoking,那么应该怎么修饰该函数?
以下是本次实验所使用到的测试代码,请使用remix编辑器完成该实验
示例1
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract grandFather{
uint gudong = 100;
function study()public view returns(string memory){
return "XueXi";
}
}
contract father{
uint money = 999;
function smoking() public pure returns (string memory) {
return "I like somking";
}
}
contract son is father {
function getMoney() public view returns (uint) {
return money;
}
function test() public pure returns(string memory){
return smoking();
}
//function smoking() public pure returns (string memory) {
// return "I don't like somking";
//}
}
//示例2
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Father{
uint public Money = 2000;
// uint internal Money = 3000;
// uint private Money = 4000;
// uint external Money = 5000;
function noSmoking() external pure returns(string memory){
return "I'm not somking";
}
}
contract Son is Father{
function getPrivateMoney() public view returns(uint){
return Money;
}
function test() public view returns (string memory) {
//return noSmoking();
}
}
下面是本次实验所配套的视频教程:
