Solidity中的继承

愛在花開的季節  金牌会员 | 2024-7-19 02:44:02 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 879|帖子 879|积分 2637

类似于Java中的多态,也是子继承父,孙继承父再继承爷。重写部门方法。
关键字:
  1. virtual   //父类
  2. override  //子类
复制代码
对于父类合约中的函数,在函数性质定义完之后可以加上“virtual“的关键字,这样代表这个函数到子类合约中必要被重写
  1. contract JCA{  //充当父合约
  2.     function foo() public pure virtual returns (string memory){
  3.         return "A";
  4.     }
  5.     //添加了“virtual”代表该函数可以被重写
  6.     function bar() public pure virtual returns (string memory){
  7.         return "A";
  8.     }
  9.     function baz() public pure  returns (string memory){
  10.         return "A";
  11.     }
  12.     //没有写“virtual”的方法将会被继承的子合约中
  13. }
复制代码
对于没有写关键字的函数则会将完整的函数继承到子类合约中。
对于子类,如果只继承一个父类合约的话,必要在开头声明继承的谁人父合约,不像Java中使用”extand“的关键字,在solidity中使用”is“如
  1. contract JCB is JCA{  //充当子合约
  2.     function foo() public pure override  returns(string memory){
  3.         return "B";
  4.     }
  5.     //增加“override”表示覆盖所继承合约中的函数部分,使用后别忘了在子合约名后添加上
  6.     //“is 父合约名”
  7.     function bar() public pure override returns (string memory){
  8.         return "B";
  9.     }
  10. }
复制代码
在子类合约中只继承一个合约时必要重写父类合约中带有”virtual“的函数,名相同,区别在于将”virtual“换成
”override“。
如果子类想继承多个合约的话必要接纳
  1. contract Z is X, Y{ //合约Z继承合约X与合约Y,如果还有则用逗号将合约名隔开
复制代码
的方式,而且原则是:继承的少的放前面。而且在合约里对那些必要重写的函数
  1. function foo() public pure override(X,Y)  returns(string memory){
  2.         return "de";
  3.     }   
  4.     //如果继承多个合约不仅在合约名哪里需要声明,在函数的方法里也需要
  5.     //用“override(X,Y)”声明,第一个要注意继承的顺序,往后的声明则不需要注意顺序
  6.     function bar() public pure override(Y,X)   returns (string memory){
  7.         return "de";
  8.     }
复制代码
如果继承的合约中其中一个也是继承了别的合约,例如合约Y继承了合约X,合约Z继承了合约X和合约Y时,对合约Y里面那些要重写的函数
  1. contract Y is X{ //合约Y继承合约X
  2.     function foo() public pure virtual override  returns(string memory){
  3.         return "shui";
  4.     }   
  5.     function bar() public pure virtual override  returns (string memory){
  6.         return "shui";
  7.     }
  8.      function y() public pure returns (string memory){
  9.         return "Y";
  10.     }
  11. }
复制代码
 当父类合约中有构造函数时:
  1. contract X {
  2.     string public name;
  3.     constructor(string memory _name){
  4.         name = _name;
  5.     }
  6. }
  7. contract Y {
  8.     string public text;
  9.     constructor(string memory _text){
  10.         text = _text;
  11.     }
  12. }
复制代码
对于子类合约,如果知道父级合约的构造函数数据类型的话则
  1. //当父级合约中有构造函数,继承时在父级合约的后面“(数据类型)”填写相应类型的数据
  2. //这个数据类型是指在父级合约中的构造函数中所定义的数据类型  
  3. contract Z is X("yun"), Y("xue"){ //合约Z继承合约X与合约Y  <br>  }
复制代码
当然如果不知道父级合约构造函数的数据类型的话就必要手动输入数据了即
  1. contract V is X , Y{
  2.     constructor(string memory _name ,string memory _text) X(_name) Y(_text){
  3.         //通过自己输入,将数据传给父合约
  4.     }
  5. }
复制代码
两种方法可以混用。继承顺序影响运行顺序。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

愛在花開的季節

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表