هر contract می تواند از یک یا چند contract دیگر ارث بری کند. در صورتی که یک contract فرزند یک contract دیگر باشد به فانکشن های پابلیک contract والد خود نیز دسترسی دارد. به این ویژگی ارث بری یا inheritance گفته می شود.
از این ویژگی می توان برای پیاده سازی سناریو های منطقی و واقعی استفاده کرد. برای ارث بری کردن از یک contract باید جلو تعریف contract از کلید واژه is استفاده کرد و نام contract که قرار است از آن ارث بری انجام شود را نوشت.
به مثال زیر دقت کنید:
در مثال فوق قرارداد Cat از قرارداد Animal ارث بری می کند در نتیجه در قرارداد Cat می توان به فانکشن walk که در قرارداد والد تعریف شده دسترسی پیدا کرد و آن را فراخوانی کرد.
هنگامی که چندین فایل contract داشته باشیم می توان قرارداد هارا در یک دیگر import کرد و از آن ها در یکدیگر استفاده کرد.
به مثال زیر توجه کنید:
در مثال فوق در کنار دایرکتوری که فایل قرارداد newContract قرارگرفته یک فایل contract دیگر به اسم SomeOtherContract قرار گرفته که در بالای قرارداد newContract بوسیله کلید واژه import ایمپورت شده است تا بتوان آن را ارث بری کرد.
در زبان سالیدیتی متغیر هارا به صورت می توان ذخیره سازی کرد.
متغیر اگر در storage ذخیره شود به این معناست که دیتای آن برای همیشه در بلاکچین نگه داری میشود. (مثل نگه داری اطلاعات در disk کامپیوتر). متغیر اگر در memory ذخیره شود دیتای آن موقتی است و از بین می رود. ( مثل ذخیره سازی در RAM کامپیوتر).
در هنگام تعریف متغیر ها می توان از دو کلید واژه storage و memory استفاده کرد تا مشخص شود متغیر در کجا ذخیره شود. در اکثر موارد لازم نیست توسعه دهندگان تشخیص دهند که متغیر کجا ذخیره شود.
خوشبختانه compiler زبان solidity خود قابلیت تشخیص این مورد را دارد. state variables (متغیر هایی که در بالای قرارداد تعریف میشوند نه در فانکشن ها) به صورت پیشفرض در storage ذخیره می شوند و اطلاعات آن ها برای همیشه در بلاکچین نوشته می شود. بقیه متغیر ها( متغیر هایی که در فانکشن ها تعریف می شوند) به صورت دیفالت در memory ذخیر می شوند و مقدار آن ها پس از پایان فراخوانی فانکشن ها از بین می رود.
در بعضی از موارد لازم می شود که یک متغیر را به صورت storage در فانکشن های ذخیره سازی کرد که در این موارد از کلید واژه storage هنگام تعریف آن متغیر باید استفاده کرد.
در جلسات پیشین در مورد public و private بودن فانکشن ها توضیح دادم. علاوه بر public و private در سالیدیتی دو مورد دیگر نیز مشابه این موارد وجود دارد. internal و external.
فانکشن های internal مشابه private هستند. با این تفاوت که در صورتی که در قرارداد والد تعریف شده باشند در قرارداد های فرزند نیز به آن فانکشن ها می توان دسترسی پیدا کرد و آن هارا فراخوانی کرد.
فانکشن های external نیز مشابه public هستند. با این تفاوت که در صورتی که یک فانکشن به صورت external تعریف شده باشد فقط می توان بیرون از قراردادی که در آن تعریف شده به آن دسترسی پیدا کرد و آن را فراخوانی کرد.
به مثال زیر دقت کنید:
در مثال فوق ۲ قرارداد تعریف شده است. قراردادی به اسم Sandwich و قراردادی به اسم BLT.قرارداد BLT از قرارداد Sandwich ارث بری می کند. در نتیجه در قرارداد BLT و در فانکشن eatWithBacon می توانیم به فانکشن eat که در قرارداد والد تعریف شده است درسترسی پیدا کنیم و آن را فراخوانی کنیم. (به دلیل اینکه به صورت internal تعریف شده است.)
در سالیدیتی می توان Interface تعریف کرد. Interface ها در سالیدیتی مشابه contract ها تعریف می شوند. با این تفاوت که در اینترفیس ها فقط می توان امضای فانکشن هارا تعریف کرد. به مثال زیر دقت کنید:
در مثال فوق یک Interface تعریف شده است که شامل تعریف فانکشن getNum می باشد. همانطور که می بینید فقط امضا و تعریف این متد مشخص شده است و بدنه ی فانکشن پیاده سازی نشده.
برای اتصال از یک contract به یک contract دیگر در شبکه بلاکچین از اینترفیس ها استفاده می شود. فرض کنید در حال توسعه یک contract هستیم. در بین کار نیاز می شود تا یک فانکشن از یک contract دیگر در بلاکچین را فراخوانی کنیم و از اطلاعات آن استفاده کنیم. برای این کار باید ابتدا یک interface از فانکشنی که قرار است صدا بزنیم بسازیم که در قسمت بعدی به آن می پردازم.
امیدوارم این قسمت مورد توجه شما قرار گرفته باشد.
در قسمت بعدی موارد بیشتری را پوشش می دهم. در صورتی که نیاز داشتید حتما مطالب قسمت های قبلی را نیز مطالعه کنید.
در صورتی که تمایل داشتید می توانید من را در لینکدین دنبال کنید و یا سوالات خود را در نظرات بپرسید. ممنونم