سازنده در سالیدیتی
18 مرداد 1401 1401-05-18 12:53سازنده در سالیدیتی
سازنده در سالیدیتی
سازنده در سالیدیتی یکی از مفاهیم متداول در برنامه نویسی شی گرایی و در بسیاری از زبان های برنامه نویسی
از جمله جاوا یا پایتون هنگام تعریف کلاس ها می توان برای مقدار دهی اولیه متغیرهای یک کلاس در هنگام ایجاد یک آبجکت از آن استفاده کنید.سازنده یک روش خاص در هر زبان برنامه نویسی شی گرا است که هر زمان که یک شی از یک کلاس مقدار دهی اولیه شود فراخوانی می شود. سازنده در سالیدیتی کاملاً متفاوت است، Solidity یک اعلان سازنده را در داخل قرارداد هوشمند ارائه می دهد و زمانی که قرارداد مستقر می شود فقط یک بار فراخوانی می کند و برای مقداردهی اولیه وضعیت قرارداد استفاده می شود. اگر سازنده به صراحت تعریف نشده باشد،یک سازنده پیشفرض توسط کامپایلر ایجاد میشود.سازنده در سالیدیتی یک تابع ویژه است که برای مقداردهی اولیه متغیرهای حالت در یک قرارداد استفاده می شود. سازنده هنگام ایجاد قرارداد برای اولین بار فراخوانی می شود و می توان از آن برای تنظیم مقادیر اولیه استفاده کرد.
ساخت یک سازنده در سالیدیتی
یک سازنده با استفاده از کلمه کلیدی سازنده بدون هیچ نام تابعی که توسط یک اصلاح کننده دسترسی دنبال می شود، تعریف می شود. این یک تابع اختیاری است که متغیرهای حالت قرارداد را مقداردهی اولیه می کند. سازنده می تواند داخلی یا عمومی باشد، سازنده داخلی قرارداد را به عنوان انتزاعی علامت گذاری می کند.سازنده تابعی است که یک بار در حین استقرار قرارداد هوشمند فراخوانی می شود. همچنین فقط یک بار فراخوانی می شود و پس از آن دیگر نمی توان آن را فراخوانی کرد.
سازنده در سالیدیتی دارای شرایط زیر است.
- هر قرارداد هوشمند می تواند یک تابع سازنده داشته باشد.
- هدف سازنده در سالیدیتی مقدار دهی اولیه state variable ها قبل از دیپلوی
- استفاده از سازنده در قرارداد هوشمند اختیاری است و سازنده ها یک تابع اختیاری هستند
- در صورتی که سازنده تعریف نشده باشد، سازنده پیش فرض در قرارداد هوشمند وجود دارد
- سازنده در سالیدیتی فقط یک بار اجرا (فراخوانی) می شود و دوباره اجرا نمی شود.
- سازنده می تواند عمومی یا داخلی باشد.
سازنده با استفاده از یک کلمه کلیدی سازنده بدون هیچ نام تابعی که توسط یک اصلاح کننده دسترسی دنبال می شود، تعریف می شود. این یک تابع اختیاری است که متغیرهای حالت قرارداد را مقداردهی اولیه می کند.سازنده داخلی قرارداد را به عنوان انتزاعی علامت گذاری می کند.
سینتکس سازنده در زبان سالیدیتی
constructor() <Access Modifier> { }
پس از اجرای سازنده، کد نهایی قرارداد در بلاک چین مستقر می شود. استقرار کد هزینه Gas اضافی خطی به طول کد دارد. این کد شامل تمام توابعی است که بخشی از رابط عمومی هستند و همه توابعی که از آنجا از طریق فراخوانی تابع قابل دسترسی هستند. کد سازنده یا توابع داخلی که فقط از سازنده فراخوانی می شوند را شامل نمی شود.در بخش زیر نمونه کد سازنده در سالیدیتی به صورت داخلی و عمومی آورده شده است.
pragma solidity ^0.5.0; contract A { uint public a; constructor(uint _a) internal { a = _a; } } contract B is A(1) { 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 in Inheritance)
در صورتی که سازنده تعریف نشده باشد، سازنده پیش فرض فراخوانی می شود، اما اگر سازنده در قرارداد مادر تعریف شده باشد و آرگومان هایی داشته باشد، قرارداد فرزند نیز باید پارامترهای مورد نیاز را در اختیار سازنده قرار دهد. اگر قرارداد فرزند هیچ پارامتری را به سازنده والد منتقل نکند، قرارداد فرزند به یک قرارداد انتزاعی تبدیل میشود. دو روش برای فراخوانی سازنده قرارداد مادر وجود دارد:
1. مقداردهی اولیه مستقیم: در مثال زیر، از روش مقداردهی اولیه برای مقداردهی اولیه سازنده کلاس والد استفاده شده است.
// 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();
}
}
تصویر خروجی کد های مقداردهی اولیه غیر مستقیم
نیاز به سازنده در سالیدیتی
سازنده ها در قرارداد هوشمند بسیار مفید هستند، مقدار پارامتر را می توان در زمان اجرا تعریف کرد و همچنین می تواند فراخوانی متد را محدود کند. اضافه بار سازنده در زبان برنامه نویسی سالیدیتی پشتیبانی نمی شود، فقط به یک سازنده در هر زمان اجازه می دهد.
مثال: در مثال زیر قرارداد constructorExample از یک سازنده برای نشان دادن نیاز به سازنده تشکیل شده است.
// Solidity program to demonstrate
// Need of constructors
pragma solidity ^0.5.0;
// Creating a contract
contract constructorExample {
// Declaring state variable
string str;
address private owner
= 0x62Ab98A0efB752C48bd82836D0b4335018B9B97e;
// Defining constructor
constructor(string memory string) public {
if(msg.sender == owner){
str = string;
}
}
// Defining function to
// return value of 'str'
function getValue() public view returns (
string memory) {
return str;
}
}
تصویر خروجی کدهای نیاز به سازنده در سالیدیتی
مثالی دیگر از سازنده در برنامه نویسی سالیدیتی
pragma solidity ^0.5.0;
contract Example {
// declare a state variable
uint _a;
// create a constructor to initialize _a
constructor (uint a) public {
_a = a;
}
// getter function to get value of _a
function getA() public view returns(uint){
return _a;
}
}
توضیحات کد های نوشته شده در مثال بالا:
خط 3: قراردادی به نام Example ایجاد می کنیم.
خط 5: یک متغیر حالت _a را اعلام می کنیم.
خط 8: سازنده ای ایجاد می کنیم که مقدار _a را مقداردهی اولیه می کند.
خط 13: یک تابع getA برای بازیابی مقدار _a ایجاد می کنیم.
جمع بندی مقاله سازنده در Solidity
هنگام ایجاد قرارداد هوشمند Solidity، می توانیم یک تابع خاص به نام سازنده را اعلام کنیم. یک سازنده شامل منطق اولیه سازی متغیرهای حالت است.در سایر زبان های برنامه نویسی شی گرا، هر زمان که یک شی از یک کلاس نمونه سازی شود، یک سازنده فراخوانی می شود. یک سازنده تنها زمانی قابل فراخوانی است که قرارداد هوشمند در زبان سالیدیتی مستقر شده باشد. پس از استقرار، راهی برای فراخوانی مجدد سازنده وجود ندارد.
منابع مقاله Solidity Constructors
وب سایت : geeksforgeeks – educative.io