区块链笔记:智能合约之合约继承和合约消息

合约继承之抽象函数

pragma solidity ^0.4.19

// 这里是一个测试合约 AbstractContractTest
contract AbstractContractTest {
    // 这是一个抽象方法
    funciton Door() public returns (uint256);
}
  • 合约中的抽象方法没有方法体
  • 可以被继承的子合约重写方法

合约继承之语法

pragma solidity ^0.4.19

contract AbstractContractTest {
    // 这是一个抽象方法
    funciton Door() public returns (uint256);
}

contract ImplementContract is AbstractContractTest {
    funciton Door() public returns (uint256) {
        return block.number;
    }
}

  • ImplementContract合约通过关键字is来继承了AbstractContractTest方法
  • 并且重写了Door这个方法,使得这个方法拥有了一个方法体
  • 这个就叫做对抽象方法的继承
  • 在编写合约的时候,可以把一些公共的方法以抽象方法的形式定义好,后面再来做具体的实现

合约消息

1) 合约相互调用

合约消息是合约之间的一些调用处理(相互调用),通过下面的代码来说明

pragma solidity ^0.4.19;

// 声明Algorithm中的方法 这是一份合约
contract Algorithm {
    function Add(uint a, uint b) public pure returns(uint);
    function Minus(uint a, uint b) public pure returns(uint);
    function Multiple(uint a, uint b) public pure returns(uint);
    function Divide(uint a, uint b) public pure returns(uint);
}

// 这个合约是对前面Algorithm合约进行调用
contract InvokeContractTest {
    // 下面的地址是硬编码的,主要是为了描述合约调用这个意思, 部署之后才会获得合约地址
    // 注意这里的合约地址必须是经过checksum(校验码)格式转换的,这是以太要求的格式
    // 以太的地址都是一个16进制的地址格式,20个字节,160位
    // 在地址使用过程中,往往会因为误输入包括大小写存在问题,所以以太提供了一个校验方法
    // 根据某个校验的方法将地址转换成带有校验能力的地址格式
    // 可以看到以下地址中有些字母是大小写区分的,是符合校验码格式的
    // 现在默认校验地址都是经过校验格式的,除非是早先的一些地址格式需要转换
    address public algorithmAddr = 0x77238F0407aF96Fd26Fe22A9996B2349F1ebb91f;

    // 实例化合约 这里很像Java实例化的写法
    Algorithm algorithm = Algorithm(algorithmAddr);

    // 调用Algorithm中的Add方法
    function InvokeAlgorithmAdd() public view returns(uint) {
        return algorithm.Add(100, 200);
    }
}

2) 合约创建合约

在这里我们通过代码来说明如何创建(这里的创建是创建另一个合约的对象)

pragma solidity ^0.4.19;

contract MyAccount {
    uint initAmount;

    // 这个方法可以对合约中的属性变量进行赋值
    function MyAccount(uint giveInitAmount) public payable {
        initAmount = giveInitAmount;
    }
}

// 初始化合约
contract Initialeize {
    // 创建方法1:创建合约示例
    MyAccount myAccount = new MyAccount(100);

    // 创建方法2:通过参数创建合约
    function newAccount(uint curInit) public {
        myAccount = new MyAccount(curInit);
    }

    // 创建方法3:通过参数创建合约并发送以太币
    // 在以太坊中,以太币除了可以被账户地址拥有以外还可以被一个合约地址来拥有
    function newAccountWithEther(uint curInit, uint amount) public {
        myAccount = (new MyAccount).value(amount)(curInit);
    }
}

以上是三种合约的创建方式,第三种比较特殊,还给合约发送了以太币

发布了450 篇原创文章 · 获赞 254 · 访问量 72万+

猜你喜欢

转载自blog.csdn.net/Tyro_java/article/details/105006797
今日推荐