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);
}
}
以上是三种合约的创建方式,第三种比较特殊,还给合约发送了以太币
- 不是抽象方法可以被继承吗?
- 继承的方法是否可以有不同的返回类型?
- 父子继承合约可以分别写在不同的代码文件吗?