وراثت در سالیدیتی
2 مرداد 1401 1401-05-02 12:46وراثت در سالیدیتی
وراثت در سالیدیتی
وراثت یکی از مهم ترین ویژگی های زبان برنامه نویسی شی گرا است. این روشی برای گسترش عملکرد یک برنامه است که برای جدا کردن کد استفاده می شود، وابستگی را کاهش می دهد و قابلیت استفاده مجدد از کد موجود را افزایش می دهد.از مهم ترین مزایای اصلی استفاده از وراثت در سالیدیتی قابلیت استفاده مجدد از کدها ، جلوگیری از افزونگی و کاهش پیچیدگی زمان قطعه کد ما می شود.در اصل با استفاده از وراثت در سالیدیتی خوانایی کدها افزایش پیدا می کند.
جهت دریافت اطلاعات بیشتر قبل از مطالعه مقاله وراثت در سالیدیتی توصیه می کنیم مقالات و محتواهای آموزش زبان سالیدیتی را هم مطالعه نمایید.
- قرارداد هوشمند یا اسمارت کانترکت (Smart Contract) چیست؟
- کاربردهای برنامه نویسی سالیدیتی
- کسب درآمد دلاری با قرارداد هوشمند
- ماشین مجازی اتریوم چیست؟
- توسعه قرارداد هوشمند در محیط ریمیکس
- مدیریت خطا در سالیدیتی
وراثت در سالیدیتی (Inheritance)
زبان برنامه نویسی سالیدیتی از وراثت بین قراردادهای هوشمند پشتیبانی می کند، جایی که چندین قرارداد را می توان در یک قرارداد واحد به ارث برد.Solidity Inheritance بین قراردادهای هوشمند پشتیبانی می کند، که در آن قراردادهای متعدد را می توان در یک قرارداد به ارث برد. قراردادی که سایر قراردادها از آن ویژگیها را به ارث میبرند، قرارداد پایه و قراردادی که ویژگیها را به ارث میبرند، قرارداد مشتق میگویند.در Solidity قرارداد مشتق شده ویژگی های قرارداد والد را به ارث می برد.این ویژگی ها شامل متغیر ها در سالیدیتی ، توابع در سالیدیتی ، Modifier و رویدادها در سالیدیتی می شوند.زبان برنامه نویسی Solidity از وراثت چندگانه هم پشتیبانی می کند.به عنوان مثال قرارداد دوم و سوم از قرارداد اول مشتق شده و قرارداد چهارم مشتق شده از قرارداد دوم سوم و اول هست تصویر زیر وراثت چندگانه در مثالی که در مورد وراثت چندگانه در زبان برنامه نویسی سالیدیتی گفته شد را به شما نشان می دهد.
همانطور که در تصویر بالا مشاهده می کنید وراثت واحد می تواند چندین سطح داشته باشد. با این حال، ممکن است چندین قرارداد نیز وجود داشته باشد که از یک قرارداد پایه یکسان ناشی می شود. این قراردادهای مشتق شده را می توان به عنوان قراردادهای پایه با هم در کلاس های فرزند بعدی استفاده کرد. هنگامی که قراردادها از چنین قراردادهای فرزندی با هم ارث می برند، وراثت چندگانه به وجود می آید.
در بخش زیر نمونه کد های مربوط به وراثت چندگانه در زبان برنامه نویسی سالیدیتی در محیط ریمیکس نمایش داده شده است.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
/* Graph of inheritance
A
/ \
B C
/ \ /
F D,E
*/
contract A {
function foo() public pure virtual returns (string memory) {
return "A";
}
}
// Contracts inherit other contracts by using the keyword 'is'.
contract B is A {
// Override A.foo()
function foo() public pure virtual override returns (string memory) {
return "B";
}
}
contract C is A {
// Override A.foo()
function foo() public pure virtual override returns (string memory) {
return "C";
}
}
// Contracts can inherit from multiple parent contracts.
// When a function is called that is defined multiple times in
// different contracts, parent contracts are searched from
// right to left, and in depth-first manner.
contract D is B, C {
// D.foo() returns "C"
// since C is the right most parent contract with function foo()
function foo() public pure override(B, C) returns (string memory) {
return super.foo();
}
}
contract E is C, B {
// E.foo() returns "B"
// since B is the right most parent contract with function foo()
function foo() public pure override(C, B) returns (string memory) {
return super.foo();
}
}
// Inheritance must be ordered from “most base-like” to “most derived”.
// Swapping the order of A and B will throw a compilation error.
contract F is A, B {
function foo() public pure override(A, B) returns (string memory) {
return super.foo();
}
}
دامنه وراثت در Solidity فقط به اصلاح کننده های عمومی و داخلی محدود می شود. برخی از ویژگی های مهم وراثت در Solidity عبارتند از:
- یک قرارداد مشتق شده می تواند به همه اعضای غیر خصوصی از جمله متغیرهای حالت و روش های داخلی دسترسی داشته باشد. اما استفاده از این مجاز نیست.
- نادیده گرفتن تابع مجاز است مشروط بر اینکه امضای تابع ثابت بماند. در صورت اختلاف پارامترهای خروجی، کامپایل با شکست مواجه می شود.
- ما می توانیم تابع یک قرارداد فوق العاده را با استفاده از یک کلمه کلیدی فوق العاده یا با استفاده از یک نام قرارداد فوق العاده فراخوانی کنیم.
- در مورد وراثت های چندگانه، فراخوانی تابع با استفاده از super به اکثر قراردادهای مشتق شده ترجیح می دهد.
انواع وراثت در سالیدیتی Solidity
زبان برنامه نویسی سالیدیتی از انواع مختلفی از ارث بری پشتیبانی می کند که در بخش زیر به معرفی انواع وراثت در زبان برنامه نویسی سالیدیتی همراه با مثال و خروجی کدهای مربوط به وراثت در سالیدیتی آموزش داده خواهد شد.
وراثت تک سطحی یا Single Inheritance
مثال: در قطعه کد زیربرای نشان دادن وراثت تک سطحی از قرارداد والد توسط قرارداد فرزند به ارث می رسد.در این مثال با استفاده از وراثت تنها یا همان Single Inheritance وراثت توسط قرارداد فرزند از قرارداد والد صورت می گیرد.
// Solidity program to
// demonstrate
// Single Inheritance
pragma solidity >=0.4.22 <0.6.0;
// Defining contract
contract parent{
// Declaring internal
// state variable
uint internal sum;
// Defining external function
// to set value of internal
// state variable sum
function setValue() external {
uint a = 10;
uint b = 20;
sum = a + b;
}
}
// Defining child contract
contract child is parent{
// Defining external function
// to return value of
// internal state variable sum
function getValue(
) external view returns(uint) {
return sum;
}
}
// Defining calling contract
contract caller {
// Creating child contract object
child cc = new child();
// Defining function to call
// setValue and getValue functions
function testInheritance(
) public returns (uint) {
cc.setValue();
return cc.getValue();
}
}
تصویر خروجی مربوط به وراثت تک سطحی در سالیدیتی
وراثت چند سطحی یا Multi-level Inheritance
وراثت چند سطحی در برنامه نویسی سالیدیتی شباهت زیادی به وراثت تک سطحی دارد، اما تفاوت آن سطح رابطه بین والد و فرزند می باشد. قرارداد فرزند نشات گرفته از والدینی است که این والد خود از قراردادی دیگر نشات گرفته است.یعنی قرارداد سوم از قرارداد دوم ارث می برد و قرارداد دوم از قرارداد اول ارث می برد.
مثال: در مثال زیر، قرارداد A به قرارداد B به ارث میرسد، قرارداد B به قرارداد C به ارث میرسد تا وراثت چند سطحی یا همان Multi-level Inheritance را به شما نشان دهد.
// Solidity program to
// demonstrate Multi-Level
// Inheritance
pragma solidity >=0.4.22 <0.6.0;
// Defining parent contract A
contract A {
// Declaring state variables
string internal x;
string a = "Geeks" ;
string b = "For";
// Defining external function
// to return concatenated string
function getA() external{
x = string(abi.encodePacked(a, b));
}
}
// Defining child contract B
// inheriting parent contract A
contract B is A {
// Declaring state variables
// of child contract B
string public y;
string c = "Geeks";
// Defining external function to
// return concatenated string
function getB() external payable returns(
string memory){
y = string(abi.encodePacked(x, c));
}
}
// Defining child contract C
// inheriting parent contract A
contract C is B {
// Defining external function
// returning concatenated string
// generated in child contract B
function getC() external view returns(
string memory){
return y;
}
}
// Defining calling contract
contract caller {
// Creating object of child C
C cc = new C();
// Defining public function to
// return final concatenated string
function testInheritance(
) public returns (
string memory) {
cc.getA();
cc.getB();
return cc.getC();
}
}
تصویر خروجی مربوط به وراثت چند سطحی در سالیدیتی
وراثت سلسله مراتبی یا Hierarchical Inheritance
در وراثت سلسله مراتبی، قرارداد والد بیش از یک قرارداد فرزند دارد. از وراثت سلسله مراتبی بیشتر زمانی استفاده می شود که قرار است از یک عملکرد مشترک در مکان های مختلف استفاده شود.
مثال: قطعه کد زیر در زبان برنامه نویسی سالیدیتی، قرارداد A توسط قرارداد B به ارث برده و هم چنین قرارداد A توسط قرارداد C به ارث برده شده است.به این شکل از وراثت در سالیدیتی وراثت سلسله مراتبی می گوییم.در اصل قرارداد B از قرار داد A مشتق شده است و قرارداد C هم از قرارداد A مشتق شده است.
// Solidity program to demonstrate
// Hierarchical Inheritance
pragma solidity >=0.4.22 <0.6.0;
// Defining parent contract A
contract A {
// Declaring internal
// state variable
string internal x;
// Defining external function
// to set value of
// internalstate variable
function getA() external {
x = "GeeksForGeeks";
}
// Declaring internal
// state variable
uint internal sum;
// Defining external function
// to set the value of
// internal state variable sum
function setA() external {
uint a = 10;
uint b = 20;
sum = a + b;
}
}
// Defining child contract B
// inheriting parent contract A
contract B is A {
// Defining external function to
// return state variable x
function getAstr(
) external view returns(string memory){
return x;
}
}
// Defining child contract C
// inheriting parent contract A
contract C is A {
// Defining external function to
// return state variable sum
function getAValue(
) external view returns(uint){
return sum;
}
}
// Defining calling contract
contract caller {
// Creating object of contract B
B contractB = new B();
// Creating object of contract C
C contractC = new C();
// Defining public function to
// return values of state variables
// x and sum
function testInheritance(
) public returns (
string memory, uint) {
return (
contractB.getAstr(), contractC.getAValue());
}
}
تصویر خروجی مربوط به وراثت سلسله مراتبی سالیدیتی
وراثت چندگانه یا Multiple Inheritance
در بخش بالا در مورد وراثت چندگانه مثالی را مطرح نمودیم و به توضیحات مربوط به وراثت چندگانه در سالیدیتی پرداختیم.در وراثت چندگانه (Multiple Inheritance) ، یک قرارداد واحد را می توان از بسیاری از قراردادها به ارث برد. قرارداد والد می تواند بیش از یک قرارداد فرزند داشته باشد در حالی که قرارداد فرزند می تواند بیش از یک والد داشته باشد.
مثال: در قطعه کد زیر، قرارداد A توسط قرارداد B به ارث برده شده است و قرارداد C از قرارداد A و قرارداد B مشتق شده است در اصل قرارداد C هم زمان از قرارداد های A و B ارث برده است. بنابراین این مثال به ما وراثت چندگانه در سالیدیتی یا Multiple Inheritance را نشان می دهد.
// Solidity program to
// demonstrate
// Multiple Inheritance
pragma solidity >=0.4.22 <0.6.0;
// Defining contract A
contract A {
// Declaring internal
// state variable
string internal x;
// Defining external function
// to set value of
// internal state variable x
function setA() external {
x = "GeeksForGeeks";
}
}
// Defining contract B
contract B {
// Declaring internal
// state variable
uint internal pow;
// Defining external function
// to set value of internal
// state variable pow
function setB() external {
uint a = 2;
uint b = 20;
pow = a ** b;
}
}
// Defining child contract C
// inheriting parent contract
// A and B
contract C is A, B {
// Defining external function
// to return state variable x
function getStr(
) external returns(string memory) {
return x;
}
// Defining external function
// to return state variable pow
function getPow(
) external returns(uint) {
return pow;
}
}
// Defining calling contract
contract caller {
// Creating object of contract C
C contractC = new C();
// Defining public function to
// return values from functions
// getStr and getPow
function testInheritance(
) public returns(string memory, uint) {
contractC.setA();
contractC.setB();
return (
contractC.getStr(), contractC.getPow());
}
}
تصویر خروجی مربوط به وراثت چندگانه زبان سالیدیتی
منبع کدهای مقاله وراثت در سالیدیتی
وب سایت: geeksforgeeks