اینترفیس در برنامه نویسی سالیدیتی
30 شهریور 1401 1401-06-30 13:51اینترفیس در برنامه نویسی سالیدیتی
اینترفیس در برنامه نویسی سالیدیتی
اگر با Interface در زبان های برنامه نویسی شی گرا آشنایی داشته باشید باید بدانید که interface در سالیدیتی نیز دقیقا مانند رابط Interface در دیگر زبان های برنامه نویسی شی گرا عمل می کند. اگر بخواهیم با یک مثال اینترفیس در سالیدیتی را بیان کنیم می توان گفت : فرض کنید در قصد دارید چراغ های خودرو را روشن کنید، شما با زدن کلید داخل خودرو این کار را انجام می دهید اما در واقع زمانی که شما کلید را فشار می دهید چندین عمل دیگر اتفاق می افتد تا در نهایت چراغ خودرو روشن شود.اینترفیس در solidity معمولا در بالای قرارداد هوشمند اضافه می شوند. شما با کلمه کلیدی “Interface” می توانید آنها را به قرارداد اضافه کنید. شما می توانید از اینترفیس در سالیدیتی برای فراخوانی تابع ها در قرارداد دیگر استفاده کنید. Interface شامل امضاهای تابع بدون اجرای تعریف تابع است.
اینترفیس در solidity چیست؟
رابط در Solidity چیست؟ رابط ها اغلب در بالای قرارداد هوشمند یافت می شوند. آنها با استفاده از کلمه کلیدی “Interface” شناسایی می شوند. اینترفیس شامل امضاهای تابع بدون اجرای تعریف تابع است.
یک اینترفیس در Solidity مشابه قراردادهای رابط در زبان های برنامه نویسی شی گرا سنتی عمل می کند. در برنامه نویسی شی گرا، اینترفیس توصیفی از تمام عملکردهایی است که یک شی باید داشته باشد تا بتواند کار کند. هدف یک اینترفیس اعمال مجموعه ای از خصوصیات تعریف شده و اجرای توابع خاص در یک شی دیگر است. به عنوان مثال، هنگامی که یک سوئیچ چراغ را می چرخانید، چراغ روشن می شود. برای شما مهم نیست که چگونه چراغ روشن می شود.
اینترفیس صرفاً یک قرارداد و پروتکل هست.اگه چند کلاس مشابه داشته باشیم و بخواهیم کاری کنیم که از آن قرارداد تبعیت کنند، از اینترفیس استفاده میکنیم.معنی اینترفیس یعنی مرتبط کننده. وقتی یک کلاس از یک اینترفیس استفاده میکند، ما مطمئن میشویم که اون کلاس یک سری ویژگیهای مورد نظر ما را دارد.اینترفیس ها در سالیدیتی مشابه contract ها تعریف می شوند. با این تفاوت که در اینترفیس ها فقط می توان امضای فانکشن هارا تعریف کرد. به مثال زیر دقت کنید:
در مثال فوق یک Interface تعریف شده است که شامل تعریف فانکشن getNum می باشد. همانطور که می بینید فقط امضا و تعریف این متد مشخص شده است و بدنه ی فانکشن پیاده سازی نشده.برای اتصال از یک contract به یک contract دیگر در شبکه بلاکچین از اینترفیس ها استفاده می شود. فرض کنید در حال توسعه یک contract هستیم. در بین کار نیاز می شود تا یک فانکشن از یک contract دیگر در بلاکچین را فراخوانی کنیم و از اطلاعات آن استفاده کنیم. برای این کار باید ابتدا یک interface از فانکشنی که قرار است صدا بزنیم بسازیم که در قسمت بعدی به آن می پردازم.
چه محدودیت هایی در اینترفیس وجود دارد؟
- آنها نمی توانند از قراردادهای دیگر ارث ببرند، اما می توانند از Interface های دیگر ارث ببرند.
- توابع یک Interface فقط می توانند از نوع external باشند.
- آنها نمی توانند سازنده (Constructor) را اعلام کنند.
- آنها نمی توانند متغیرهای حالت (State Variable) را اعلام کنند.
ویژگی های Interface در سالیدیتی :
- برای اضافه کردن رابط باید از کلمه کلیدی Interface استفاده کنید
- برخی از نام های Interface با یک “I” شروع می شوند تا شناسایی آنها در کد آسان تر شود.
- تمام توابع Interface به طور ضمنی مجازی هستند.
- می توانید یک تابع Interface را لغو کنید.
- قراردادها می توانند Interface ها را به ارث ببرند همانطور که قراردادهای دیگر را به ارث می برند.
- همه توابعی که از Interface به ارث میبرند باید override modifier را روی هر تابعی که یک تابع Interface را overrides میکند تنظیم کنند. در غیر این صورت کامپایلر یک خطا ایجاد می کند.
- انواع داده های تعریف شده در داخل Interface ها را می توان از قراردادهای دیگر دسترسی داشت. برای مثال، قراردادی که از Interface نمونه زیر استفاده میکند، میتواند به Iauto.carType و Iauto.vehicle دسترسی داشته باشد.
مثال: در مثال زیر، در قرارداد thisContract یک رابط InterfaceExample را پیاده سازی می کند و تمام توابع رابط را پیاده سازی می کند.
// Solidity program to
// demonstrate the working
// of the interface
pragma solidity 0.4.19;
// A simple interface
interface InterfaceExample{
// Functions having only
// declaration not definition
function getStr(
) public view returns(string memory);
function setValue(
uint _num1, uint _num2) public;
function add(
) public view returns(uint);
}
// Contract that implements interface
contract thisContract is InterfaceExample{
// Private variables
uint private num1;
uint private num2;
// Function definitions of functions
// declared inside an interface
function getStr(
) public view returns(string memory){
return "GeeksForGeeks";
}
// Function to set the values
// of the private variables
function setValue(
uint _num1, uint _num2) public{
num1 = _num1;
num2 = _num2;
}
// Function to add 2 numbers
function add(
) public view returns(uint){
return num1 + num2;
}
}
contract call{
//Creating an object
InterfaceExample obj;
function call() public{
obj = new thisContract();
}
// Function to print string
// value and the sum value
function getValue(
) public returns(uint){
obj.getStr;
obj.setValue(10, 16);
return obj.add();
}
}