مجله

Constructor در سالیدیتی + مثال

سلام دوستان عزیز سالیدیتی کد! امیدواریم حالتون خوب باشه!‌در این مقاله قصد داریم تا آموزش Constructor در سالیدیتی را بررسی کنیم. البته در دوره آموزش سالیدیتی به طور مفصل این مورد را بررسی کرده ایم، در این مقاله نیز قصد داریم تا تعریف کلی سازنده در سالیدیتی را داشته باشیم. Constructor که معنی لغوی آن “سازنده” است یکی از مفاهیم پایه در اکثر زبان های برنامه نویسی از جمله سالیدیتی است. معمولا از سازنده برای مقدار دهی اولی متغیر ها برای ایجاد یک آبجکت استفاده می شود.  Constructor در سالیدیتی کمی متفاوت است، در سالیدیتی زمانی که قرارداد هوشمند مستقر می شود برای اولین بار فراخوانی می شود تا مقدار دهی اولیه در قرارداد انجام شود. نکته ای که باید توجه کنید این است که اگر Constructor در قرارداد هوشمند ایجاد نشده باشد یک سازنده پیش فرض توسط کامپایلر در قرارداد ایجاد می شود.

اهمیت Constructor در سالیدیتی

سازنده در قرارداد هوشمند بسیار کاربردی است. شما با استفاده از آن می توانید در زمان اجرا مقادیر را تعریف کنید. همچنین فراخوانی این متد کاملا محدود است.

در ادامه به نحوه ساخت یک سازنده در سالیدیتی می پردازیم

ساخت Constructor در سالیدیتی

همانطور که گفتیم Constructor در سالیدیتی یک تابع ویژه برای مقدار دهی اولیه متغیر ها است که هنگام ایجاد قرارداد برای اولین بار فراخوانی میشود تا مقدار دهی را انجام دهد. سازنده می تواند به صورت داخلی و یا عمومی تعریف شود.

ویژگی های سازنده در سالیدیتی

سازنده در سالیدیتی دارای ویژگی های زیر است :

  1. هر قرارداد هوشمند می تواند یک سازنده داشته باشد
  2. هدف Constructor در سالیدیتی مقدار دهی اولیه متغیر ها است
  3. استفاده از سازنده اختیاری است و همانطور که اشاره شد در صورتی که ایجاد نشده باشد به صورت پیشفرض توسط کامپایلر ایجاد می شود
  4. سازنده فقط یکبار فراخوانی می شود
  5. سازنده می تواند عمومی یا داخلی باشد

نحوه تعریف Constructor در سالیدیتی


constructor() {
}

پس از اینکه سازنده اجرا شد و مقادیر اولیه در متغیر ها قرار گرفت کد نهایی قرارداد در بلاکچین مستقر می شود. در ادامه مثالی از نحوه تعریف سازنده به صورت داخلی و عمومی را مشاهده می کنید


pragma solidity ^۰.۵.;
contract A {
uint public a;
constructor(uint _a) internal {
a = _a;
}
}
contract B is A(۱) {
constructor() public {}
}

مثال: در مثال زیر، در قرارداد constructor Example، یک سازنده برای مقداردهی اولیه متغیر حالت (state variable) – str ایجاد می شود.


// Solidity program to demonstrate
// creating a constructor
pragma solidity ^0.5.0;
// Creating a contract
contract constructorExample {
// Declaring state variable
string str;
// Creating a constructor
// to set value of 'str'
constructor() public {
str = "GeeksForGeeks";
}
// Defining function to
// return the value of 'str'
function getValue(
) public view returns (
string memory) {
return str;
}
}

تصویر خروجی کد های سازنده در سالیدیتی:

تعریف constructor در سالیدیتی

Constructor یا سازنده در وراثت (Constructor in Inheritance)

در بعضی موارد سازنده در قرارداد مادر تعریف شده است. اگر Constructor در قرارداد مادر تعریف شده باشد و دارای آرگومانهایی باشد قرارداد فرزند نیز باید موارد مورد نیاز را در اختیار Constructor قرار دهد.

به طور کلی دو روش برای فراخوانی سازنده قرارداد مادر وجود دارد که در ادامه به آن اشاره می کنیم :

۱- مقداردهی اولیه مستقیم: در مثال زیر، از روش مقداردهی اولیه برای مقداردهی اولیه سازنده کلاس والد استفاده شده است.


// Solidity program to demonstrate
// Constructor in Inheritance
pragma solidity ^0.5.0;
// Creating a contract
contract Base {
// Declaring variable
uint data;
// Defining a constructor
constructor(uint _data) public {
data = _data;
}
// Defining function
function Print(
) public returns(string memory){
return "Direct Initialization";
}
}
// Child contract inheriting
// the parent contract 'Base'
contract Derived is Base(2){
// Defining a constructor
constructor() public {}
// Defining function to access
// variable of parent contract
function getData(
) external returns(uint){
uint result = data ** 2;
return result;
}
}
// Caller contract
contract caller{
// Creating an object of child contract
Derived c = new Derived();
// Accessing functions of parent
// and child contract using
// object of child contract
function getResult() public returns(uint){
c.Print();
return c.getData();
}
}

نتیجه مقدار دهی اولیه به روش مستقیم به شکل زیر خواهد بود :

مقدار دهی به روش مستقیم در سالیدیتی

۲-مقداردهی اولیه غیر مستقیم: در مثال زیر، مقداردهی اولیه غیر مستقیم برای مقداردهی اولیه سازنده کلاس پایه انجام می شود.


// Solidity program to demonstrate
// Indirect Initialization
pragma solidity ^0.5.0;
// Creating a contract
contract Base {
// Declaring state variable
string str;
// Defining a constructor
constructor(
string memory _str) public {
str = _str;
}
// Defining a function
function Print(
) public returns(string memory){
return "Indirect Initialization";
}
}
// Child contract inheriting
// parent contract 'Base'
contract Derived is Base {
// Defining a constructor
constructor(
string memory _info) Base(
string(abi.encodePacked(
_info, _info))) public {}
// Defining function to
// return value of parent
// contract variable 'str'
function getStr(
) public view returns(string memory){
return str;
}
}
// Caller contract
contract caller {
// Creating an object of
// child contract
Derived c
= new Derived("GeeksForGeeks");
//Defining a function to access
// functions of the parent
//contract and child contract
function getResult() public view{
c.Print();
c.getStr();
}
}

نتیجه مقدار دهی اولیه به روش غیر مستقیم به شکل زیر خواهد بود :

مقدار دهی به روش غیر مستقیم در سالیدیتی

نمونه Constructor در سالیدیتی

در ادامه مثالی از سازنده در سالیدیتی را مشاهده می کنید :‌


// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
// Base contract X
contract X {
string public name;
constructor(string memory _name) {
name = _name;
}
}
// Base contract Y
contract Y {
string public text;
constructor(string memory _text) {
text = _text;
}
}
// There are 2 ways to initialize parent contract with parameters.
// Pass the parameters here in the inheritance list.
contract B is X("Input to X"), Y("Input to Y") {
}
contract C is X, Y {
// Pass the parameters here in the constructor,
// similar to function modifiers.
constructor(string memory _name, string memory _text) X(_name) Y(_text) {}
}
// Parent constructors are always called in the order of inheritance
// regardless of the order of parent contracts listed in the
// constructor of the child contract.
// Order of constructors called:
// 1. X
// 2. Y
// 3. D
contract D is X, Y {
constructor() X("X was called") Y("Y was called") {}
}
// Order of constructors called:
// 1. X
// 2. Y
// 3. E
contract E is X, Y {
constructor() Y("Y was called") X("X was called") {}
}

در آخر آموزش Constructor در سالیدیتی :

امیدواریم این مقاله به شما کمک کرده باشه . constructor در سالیدیتی بسیار کاربردی است و نقش مهمی در قرارداد های هوشمند ایفا می کند.در دوره جامع آموزش سالیدیتی مفصل در مورد سازنده صحبت شده و مثال های مختلفی نیز در طول دوره زده شده.
اگر سوالی در این زمینه دارید حتما در بخش نظرات برای ما بنوسید

سالیدیتی کد را در اینستاگرام دنبال کنید

 

Print Friendly, PDF & Email
برای امتیاز به این نوشته کلیک کنید!
[کل: 1 میانگین: 5]
اشتراک گذاری:

1 دیدگاه

به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.

دیدگاهتان را بنویسید