Remix IDE报错:This contract does not implement all functions and thus cannot be created. 浅谈constructor

今天在Remix上部署合约时,遇到了这样的问题:

Deploy根本无法成功进行,但问题很明显,是合约中有什么函数出了问题,没有正确地实现,于是我首先怀疑是函数的可见性出了问题,所以我先将所有函数的可见性都调整为public,这是最不安全的,但是也是门槛最低,最容易过Deploy的方式,然后果不其然,部署成功了,然后我又逐一改回,看看到底是哪个函数的可见性出了问题导致的。

原来是constructor的可见性出了问题,我将它改为之前写的internal后,之前的问题又出现了,所以这里写public是可以的,当然什么都不写表示默认public也可以,但是会报警告,因为最好是养成每写完一个函数就将可见性写出来的习惯,即便是public也一样,代码会更加清晰。

注意,写external更是万万不可,constructor只能是internal或者public才可以,否则,就会出现如下的错误:

可谓是需要处处小心了,我查阅了一下官方文档,是这么说constructor的,希望可以进一步解释constructor可见性的使用方法:

Before the constructor code is executed, state variables are initialised to their specified value if you initialise them inline, or zero if you do not.

在构造函数执行前,状态变量是会先初始化的,初始化的结果是你用内联方式赋予的值,或者0。

A constructor is optional. Only one constructor is allowed, which means overloading is not supported.

构造函数的改写是可选的,但一个合约只允许写一个构造函数,意味着构造函数不支持重载。

After the constructor has executed, the final code of the contract is deployed to the blockchain. This code includes all public and external functions and all functions that are reachable from there through function calls. The deployed code does not include the constructor code or internal functions only called from the constructor.

构造函数执行完毕后,合约的最终代码就部署到了区块链上,最终代码包括所有的public和external函数,以及所有可以通过函数调用(call)访问到的函数。部署好的代码是不包括构造函数或者只有在构造函数中才调用到的可见性为internal的函数的。

Constructor functions can be either public or internal. If there is no constructor, the contract will assume the default constructor, which is equivalent to constructor() public {}

构造函数可以是public或者internal的,如果没有constructor,那么合约就会假定为默认构造函数,相当于constructor() 

A constructor set as internal causes the contract to be marked as abstract.

一个可见性设置为internal的构造函数会使得合约被标记成抽象的合约。(这应该就是为什么我写internal不对了,一个被标记为抽象的合约,自然会认为你的所有函数都是没有实现的,更不可能deploy了,所以写public是很重要的)

那么我们还是要想一下为什么构造函数不能用external呢?其实很明显,因为这是合约内部要用的函数,当然不能设成external了,但我们看了官方文档应该对这个事有更深一步的理解:那就是因为我们部署在区块链上的代码,是不包含constructor的,在你要使用的时候,constructor已经不在了,那你想调用constructor,又只能用外部调用,可是没有部署到区块链上,我们找不到啊,内部调用你也没给我机会,所以就根本没法用。

所以,遇到“This contract does not implement all functions and thus cannot be created.”这个错误时就去检查一下你的constructor的可见性写对了没有吧~我们写成public应该就可以了。

如果感觉有收获,欢迎关注和点赞,如果有问题,欢迎和我继续探讨,如果有错误,欢迎指正,哈哈~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值