在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構造方法的使用以及使用錯誤會導緻的異常提示。同時,授之于魚不若授之以漁,希望大家通過本篇文章能夠學習到解決問題的思路和方法。