外部函数调用–this关键字
合约sample1
contract sample1{
int a;
function sample1(int b)payable{
a=b;
}
function assign(int c){
a=c;
}
function makePayment(int d)payable{
a=d;
}
合约sample2
contract sample2{
function hello(){}
function sample2(address addressOfContract){
sample1 s=(new sample1).value(12)(23);
s.makePayment(22);
s.makePayment.value(45)(12);
s.makePayment.value(4).gas(900)(12);
this.hello();//利用this调用外部合约函数
sample1 s2=sample1(addressOfContract);
s2.makePayment(112);
}
}
注意:使用this关键字进行的调用称为外部调用。在函数中,this关键字代表当前合约实例
合约功能——深入理解合约
可见性
可见性定义了谁可以看到它,函数和状态变量有四种可见性:external、public、internal和private
函数可见性,默认为public
状态变量可见性,默认为internal
external:外部函数只能由其他合约调用,或者通过交易调用——this.f()
public:公共函数和状态变量可以用所有可行办法访问
internal:内部函数和状态变量只可以内部访问,即从当前合约内和继承它的合约访问。不可以使用this访问它
private:私有函数和状态变量类似于内部函数,但是继承合约不可以访问它们
示例
contract sample1{
int public b=78;
int internal c=90;
function sample1(){
this.a();//外部访问
b=21;//内部访问
}
function a()external{}
}
contract sample2{
int internal d=9;
int private e=90;
}
//sample3继承sample2
contract sample3 is sample2{
sample1 s;
function sample3(){
s=new sample1();
s.a();//外部访问
}
}
函数修改器(较难理解)
先看一个修改器的例子:
contract sample{
int a=90;
modifier myModifier1(int b){
int c=b;
_;
c=a;
a=1;
}
modifier myModifier2{
int c=a;
_;
}
modifier myModifier3{
a=96;
return;
_;
a=99;
}
modifier myModifier4{
int c=a;
_;
}
function myFunction()myModifier1(a)myModifier2 myModifier3 returns(int d){
a=2;
return a;
}
}
回退函数
即一个合约中唯一一个未命名函数。
不能有实参
不能有返回值
如果其他函数都不能匹配给定的函数标识符,那么就执行回退函数
如果你想让你的合约接收以太币,就必须实现回退函数
contract sample{
function()payable{
}
}
继承
即使一个合约继承自其他多个合约,在区块链上也只会创建一个合约。
父合约的代码总是会被复制到最终合约里。
关键字is
示例
contract sample1{
function a(){}
function b(){}
}
//合约2继承自合约1
contract sample2 is sample1{
function b(){}
}
contract sample3{
function sample3(int b){
}
}
//合约4继承自合约1与合约2
contract sample4 is sample1,sample2{
function a(){}
function c(){
a();
//执行合约1中的a方法
sample1.a();
//执行合约2中的b方法
b();
}
}
关键字super
用于引用最终继承链中的下一个合约
示例
contract sample1{
}
contract sample2{
}
contract sample3 is sample2{
}
contract sample4 is sample2{
}
contract sample5 is sample4{
function myFunc(){}
}
contract sample6 is sample1,sample2,sample3,sample4,sample5{
function myFunc(){
//执行sample5中的myFunc方法
super.myFunc();
}
}
抽象合约
仅包含函数原型而不包含函数实现的合约
抽象合约不能被编译
如果一个合约继承自抽象合约且不重写,那么它自己也是抽象合约
示例
contract sample1{
function a()returns(int b);
}
contract sample2{
function myFunc(){
sample1 s=sample();
s.a();
}
}