天天看點

談談Solidity中的構造方法

在Java中,如果某個類未指定構造方法,在編譯的過程中會采用預設的構造方法。

<code>public class DemoTest {</code>

<code></code>

<code>}</code>

像上面這個類,未指定任何的構造方法,但同樣可以建立DemoTest類,就是因為采用了預設的構造方法。當然,也可以像下面這樣指定一個或多個構造方法。

<code>   public DemoTest(){</code>

<code>   }</code>

在Java中一旦指定構造方法,建立對象時隻能采用聲明的構造方法。

上面回顧了一下Java的構造方法,再來了解一下Solidity的構造方法。這裡首先要區分一下Solidity的版本。先以Solidity 0.4.22之前的版本來說明。對應Java的寫法,Solidity預設的構造方法:

<code>pragma solidity ^0.4.21;</code>

<code>contract DemoTest{</code>

這裡的contract可以對應Java的class。預設構造方法與Java類似,如果未指定會采用預設的構造方法。當然,也可以明确指定構造方法。

<code>   function DemoTest() public{</code>

這樣,通過function指定了Solidity的構造方法,同時也可以像Java一樣,給構造方法指定參數,但無法像Java那樣建立多個重載的構造方法。

上面的示例是在Solidity 0.4.21版本中進行編寫代碼和編譯,如果此刻将版本更新到0.4.22再次編譯,編譯器會提示如下警告資訊:

<code>browser/DemoTest.sol:5:6: Warning: Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead.</code>

<code>    function DemoTest() public{</code>

<code>    ^ (Relevant source part starts here and spans across multiple lines).</code>

這段異常提示我們function聲明構造函數已經被廢棄,要使用constructor來聲明構造函數。這也是需要将的另外一個知識點,就是自0.4.22頒布起,廢除function+合約名稱來定義構造函數,而采用“constructor(...) { ... }”來聲明構造函數。

<code>pragma solidity ^0.4.22;</code>

<code>    constructor() public{</code>

改造之後的代碼如上圖所示,已經使用constructor來定義構造函數。此時,編譯器的版本修改為0.4.22之前的版本,再進行編譯會出現以下異常:

<code>browser/DemoTest.sol:5:17: ParserError: Expected identifier, got 'LParen'</code>

<code>               ^</code>

我們在使用Remix或Truffle的時候往往會遇到此異常資訊,就是因為構造方法與編譯版本不比對導緻。

本篇文章重點介紹不同版本下Solidity構造方法的使用以及使用錯誤會導緻的異常提示。同時,授之于魚不若授之以漁,希望大家通過本篇文章能夠學習到解決問題的思路和方法。