智能合约的封装,继承和多态,之所以这么提,是因为智能合约和面向对象实在是太像了,两者几乎是长得一模一样!
面向对象三大特性是:封装,继承,多态
所谓封装:
也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。所谓继承:
是指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。所谓多态:
就是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。
对比着看:
智能合约的封装:
关键词:public private external internal
可以访问,可以继承的是public external
只能内部访问,不可继承的是private internal智能合约的继承:
contract ERC20 is ERC20Interface{}
关键词: is智能合约的多态
多态稍显复杂点,在智能合约中是通过抽象合约来实现类似多态的功能。一个抽象合约被多个合约继承,对其方法可以有不同的实现。
注意:两个合约间只是方法的实现,不会相互改变状态变量等。
来个合约详情的例子:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30pragma solidity >0.4.23 <0.7.0;
abstract contract AbstractContract {
function add(uint m, uint n) public virtual returns(uint);
function mul(uint m, uint n) public pure returns(uint) {
return m * n;
}
}
contract MyContract is AbstractContract {
function add(uint m, uint n) public override returns(uint) {
return m + n;
}
}
contract MyContract2 is AbstractContract {
function add(uint m, uint n) public override returns(uint) {
return (m + n) * 2;
}
}
contract NewContract {
AbstractContract c = new MyContract2();
//合约的实例化以实现不同合约中的方法
function calc(uint m, uint n) public returns(uint) {
return c.add(m,n) + c.mul(m,n);
}
}
总体来讲,智能合约的功能还是比较丰富的,不过局限于存储的区块链,有很多特别细致的讲究,以至于学起来过于复杂。但是为了得到全网一致性的共识,有些性能被牺牲了,这也是可以理解的。
This page is synchronized from the post: ‘智能合约的封装,继承和多态 / 学习智能合约#9’