آموزش وراثت در سالیدیتی

وراثت در سالیدیتی قابلیتی است که به شما اجازه می‌دهد توابع و ویژگی‌های یک قرارداد دیگر را به ارث ببرید و بدون تکرار کد، قراردادهای پیچیده تری ایجاد کنید.

وراثت در سالیدیتی چیست؟

وراثت در سالیدیتی به معنی قابلیت استفاده مجدد از کدهای یک قرارداد دیگر در یک قرارداد جدید است. با استفاده از وراثت، می‌توان یک قرارداد جدید ایجاد کرد که تمام توابع و متغیرهای قرارداد پایه (پدر) را به ارث ببرد و در صورت نیاز آن‌ها را بازنویسی (override) کند.

این ویژگی باعث افزایش بهره‌وری، کاهش تکرار کد و ساختارمند شدن توسعه قراردادهای هوشمند می‌شود. مثلاً در پیاده سازی توکن های ERC20 معمولاً به‌جای نوشتن همه توابع از صفر، از یک قرارداد استاندارد استفاده می‌شود و قرارداد جدید از آن ارث بری می‌کند.

آموزش وراثت در سالیدیتی

در ادامه مثالی ساده از استفاده از وراثت را می‌بینیم که در آن یک قرارداد پایه تعریف شده و قرارداد دیگر از آن ارث بری می‌کند.

روی Remix دیپلوی کنید، اما از منوی کشویی، گزینه Child را برای دیپلوی انتخاب کنید، نه Parent.

حتی با اینکه قرارداد Child خالی است، ما تابع را در داخل Child مشاهده می‌کنیم.

وقتی یک «قرارداد» «قرارداد دیگری» است، تمام عملکردهای آن را به ارث می‌برد.

مانند دیگر زبان های برنامه نویسی شی‌گرا، توابع می‌توانند بازنویسی (override) شوند. در اینجا ساختاری برای تغییر مقدار آورده شده است.

توجه داشته باشید که فقط توابعی که virtual هستند می‌توانند بازنویسی شوند. اگر سعی کنید تابعی که virtual نیست را override کنید، کد کامپایل نخواهد شد.

همچنین، زمانی که یک تابع override می‌شود، باید دقیقاً مطابق باشد؛ هم از نظر نام، هم آرگومان ها، و هم نوع بازگشتی.

سالیدیتی از وراثت چندگانه پشتیبانی می‌کند.

اگر برایتان سوال است، در صورتی که دو والد تابعی با نام یکسان داشته باشند، فرزند باید آن را override کند، در غیر این صورت رفتار نامشخص خواهد بود. اگر در چنین شرایطی قرار گرفتید، احتمالاً در طراحی نرم‌افزار اشتباهی انجام داده‌اید. پس بهتر است وارد آن مسیر نشویم.

Private در مقابل Internal

دو روش برای غیرقابل دسترسی کردن یک تابع از بیرون وجود دارد: استفاده از مادیفایر private یا internal. تفاوت آن‌ها ساده است.

توابع (و متغیرهای) private نمی‌توانند توسط قراردادهای فرزند «دیده شوند».

توابع و متغیرهای internal می‌توانند.

کلمه‌ کلیدی super

کلمه کلیدی super به معنی «فراخوانی تابع والد» است. در اینجا چگونگی مفید بودن آن آورده شده است.

اگر در اینجا از کلمه کلیدی super استفاده نمی‌کردیم، تابع foo() خودش را صدا می‌زد و وارد بازگشت بی‌نهایت می‌شد. سعی کنید super را حذف کرده و کد را در Remix اجرا کنید. تراکنش بازمی‌گردد (revert می‌شود) چون بازگشت بی‌نهایت رخ می‌دهد (اتریوم اجازه نمی‌دهد کد برای همیشه اجرا شود، آن را به‌اجبار متوقف می‌کند. مکانیزم دقیق آن یک موضوع سطح متوسط برای بحث در آینده است).

super به این معناست که “تابع foo والد را صدا بزن، نه تابع من”. این به ما اجازه می‌دهد که تمام قابلیت‌های foo را داشته باشیم، بدون اینکه مجبور باشیم کد آن را کپی و جای گذاری کنیم.

فراخوانی سازنده والد

سالیدیتی اجازه نمی‌دهد بدون مقداردهی اولیه به سازنده‌ی والد، از آن ارث‌بری کنید. به این وضعیت توجه کنید:

راه‌حل این است که سازنده والد را در نقطه ارث بری صدا بزنید.

بیایید آنچه را که یاد گرفتیم خلاصه کنیم:

  • فقط توابعی که virtual هستند می‌توانند override شوند

  • توابعی که یک تابع والد را override می‌کنند، باید از مادیفایر override استفاده کنند

  • تابع override شده باید دقیقاً مطابقت داشته باشد؛ از نظر نام، آرگومان ها، و نوع مقدار بازگشتی

  • به جای کپی و جای گذاری کد تابع والد، می‌توانید از کلیدواژه super استفاده کنید

  • می‌توانید از چند قرارداد به‌صورت هم‌زمان ارث بری کنید

  • هنگام ارث‌بری، باید سازنده والد را به‌صورت صریح فراخوانی کنید

ایجاد یک توکن ERC20 با کمی تلاش

ارث بری، همراه با دستور import، باعث می‌شود بتوانیم به‌راحتی از کتابخانه هایی که دیگران ساخته‌اند استفاده کنیم. این قرارداد را در Remix دیپلوی کنید و خواهید دید تمام توابع ERC20 برایتان پیاده سازی شده‌اند.

نکته ای برای روشن شدن موضوع:

تفاوت زیادی بین یک قرارداد هوشمند به‌عنوان یک شیء در سالیدیتی و یک قرارداد هوشمند دیپلوی شده روی بلاکچین وجود دارد.

شما نمی‌توانید از قراردادی که روی بلاکچین دیپلوی شده، ارث بری کنید.

آن‌ها باینری هایی هستند که مستقل از شما در خارج از قرارداد شما زندگی می‌کنند. به دلیل اصطلاحات مبهم، برخی از توسعه دهندگان سالیدیتی نگران این بوده‌اند که توابع و متغیرها ممکن است توسط یک قرارداد مخرب به ارث برده یا override شوند. این امکان‌پذیر نیست. حتی اگر کد دیپلوی شده را «قرارداد» بنامیم و کد سالیدیتی را هم «قرارداد» صدا کنیم، این دو با هم یکسان نیستند.

5/5 - (1 امتیاز)

راستی! برای دریافت مطالب جدید در کانال تلگرام یا پیج اینستاگرام سورس باران عضو شوید.

آموزش انیمیشن‌ سازی دو بعدی با موهو – خلق انیمیشن‌ های خلاقانه شبیه دیرین دیرین
  • انتشار: ۱۶ اردیبهشت ۱۴۰۴

دسته بندی موضوعات

آخرین محصولات فروشگاه

مشاهده همه

نظرات

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