Состав контракта:

Solidity поддерживает состав контрактов. Композиция означает объединение нескольких контрактов или типов данных вместе для создания сложных структур данных и контрактов.

Рекомендуется разбивать проблемы на решения с несколькими контрактами и объединять их вместе, используя состав контрактов.

Наследование:

Наследование является одним из столпов объектной ориентации, а Solidity поддерживает наследование между смарт-контрактами. Наследование - это процесс определения нескольких контрактов, связанных друг с другом через родительско-дочерние отношения.

Унаследованный контракт называется родительским контрактом, а наследующий контракт называется дочерним контрактом.
Точно так же у контракта есть родительский контракт, известный как производный класс, а родительский контракт известен как базовый контракт.
Наследование в основном касается возможности повторного использования кода. Между базовым и производным контрактами существует взаимосвязь, и все публичные и внутренние функции
с ограниченными областями действия и переменные состояния доступны для производных контрактов. .

Фактически, компилятор Solidity копирует байт-код базового контракта в производный байт-код контракта. Ключевое слово is используется для наследования базового контракта в производном контракте. Это одна из самых важных концепций, которую должен освоить каждый разработчик Solidity из-за способа создания версий и развертывания контрактов.

Solidity поддерживает несколько типов наследования, включая множественное наследование. Solidity копирует базовые контракты в производный контракт, и создается единственный контракт с наследованием. Создается единый адрес, который используется совместно контрактами в родительско-дочерних отношениях.

Одинарное наследование:

Единичное наследование помогает наследовать переменные, функции, модификаторы и события базовых контрактов в производный класс.

Многоуровневое наследование:

Многоуровневое наследование очень похоже на одиночное наследование; однако вместо одной связи
родитель-потомок существует несколько уровней родительско-дочерних отношений.

Это показано на следующей диаграмме. Контракт A является родительским по контракту B, а контракт B является родительским по контракту C:

Иерархическое наследование:

Иерархическое наследование снова похоже на простое наследование. Однако здесь один контракт действует как базовый контракт для нескольких производных контрактов.

Это показано на следующей диаграмме. Здесь контракт A выводится как из контракта B, так и из контракта C:

Множественное наследование:

Solidity поддерживает множественное наследование. Одного наследования может быть несколько уровней.
Однако может быть и несколько контрактов, производных от одного и того же базового контракта.
Эти производные контракты могут использоваться в качестве базовых контрактов вместе в других дочерних классах.
Когда контракты наследуются от таких дочерних контрактов вместе, происходит множественное наследование, как показано на следующей диаграмме:

Примечание. Solidity следует по пути Python и использует линеаризацию C3, также известную как Порядок разрешения методов (MRO), чтобы установить определенный порядок в графики базовых контрактов. При наследовании контракты должны следовать определенному порядку, начиная от базового контракта до самого производного контракта.

Инкапсуляция:

Инкапсуляция - один из важнейших столпов ООП. Инкапсуляция относится к процессу сокрытия или разрешения доступа к переменным состояния напрямую для изменения их состояния.
Это относится к шаблону объявления переменных, которые не могут быть доступны напрямую клиентам и могут быть изменены только с помощью функций. Это помогает ограничить доступ к переменным, но в то же время обеспечивает достаточный доступ к классу для выполнения действий с ним.

Solidity предоставляет несколько модификаторов видимости, таких как external, public, internal и private, которые влияют на видимость переменных состояния. внутри контракта, в котором они определены, наследуя дочерние контракты или внешние контракты.

Полиморфизм:

Полиморфизм означает наличие нескольких форм. Существует два типа полиморфизма:
1. Полиморфизм функции
2. Контрактный полиморфизм.

Полиморфизм функции:

Полиморфизм функций относится к объявлению нескольких функций в одном контракте или наследованию контрактов с одинаковыми именами.
Функции различаются типами данных параметра или количеством параметров. Типы возвращаемых данных не принимаются во внимание при определении допустимых сигнатур функций для полиморфизма. Это также известно как перегрузка метода.

pragma solidity ^0.4.19;
contract helloFunctionPloymorphism {
 
 function getVariableData(int8 data) public pure returns(int8 output) {
 return data;
 }
function getVariableData(int16 data) public pure returns(int16 output) {
 return data;
 }
}

Полиморфизм контракта:

Полиморфизм контракта относится к взаимозаменяемому использованию нескольких экземпляров контракта, когда контракты связаны друг с другом посредством наследования. Полиморфизм контракта помогает вызывать производные функции контракта с использованием экземпляра базового контракта.

pragma solidity ^0.4.19;
contract ParentContract {
 uint internal simpleInteger;
function SetInteger(uint _value) public {
 simpleInteger = _value;
 }
function GetInteger() public view returns (uint) {
 return 10;
 }
}
contract ChildContract is ParentContract {
 
 function GetInteger() public view returns (uint) {
 return simpleInteger;
 }
}

Абстрактные контракты:

Контракты рефератов - это контракты, в которых есть частичные определения функций. Вы не можете создать экземпляр абстрактного контракта.
Абстрактный контракт должен быть унаследован дочерним контрактом для использования его функций.
Абстрактные контракты помогают в определении структуры контракта, и любой наследующий от него класс должен обеспечивать их реализацию.
Если дочерний контракт не обеспечивает реализацию неполных функций, даже его экземпляр не может быть создан.
Сигнатуры функций заканчиваются точкой с запятой,; , символ.
Не существует ключевого слова, предоставленного Solidity, чтобы пометить контракт как абстрактный.
Контракт становится абстрактным классом, если у него есть функции без реализации.

pragma solidity ^0.4.19;
contract abstractHelloWorld {
 function GetValue() public view returns (uint);
 function SetValue(uint _value) public;
function AddNumber(uint _value) public returns (uint) {
 return 10;
 }
}
contract HelloWorld is abstractHelloWorld{
 uint private simpleInteger;
function GetValue() public view returns (uint) {
 return simpleInteger;
 }
 
 function SetValue(uint _value) public {
 simpleInteger = _value;
 }
function AddNumber(uint _value) public returns (uint ){
 return simpleInteger = _value;
 }
}

Интерфейсы:

Интерфейсы похожи на абстрактные контракты, но есть различия. Интерфейсы не могут содержать никаких определений.
Они могут содержать только объявления функций. Это означает, что функции в интерфейсах не могут содержать никакого кода.
Их также называют чисто абстрактными контрактами. Интерфейс может содержать только сигнатуру функций.

pragma solidity ^0.4.19;
contract abstractHelloWorld {
 function GetValue() public view returns (uint);
 function SetValue(uint _value) public;
function AddNumber(uint _value) public returns (uint) {
 return 10;
 }
}
contract HelloWorld is abstractHelloWorld{
 uint private simpleInteger;
function GetValue() public view returns (uint) {
 return simpleInteger;
 }
 
 function SetValue(uint _value) public {
 simpleInteger = _value;
 }
function AddNumber(uint _value) public returns (uint ){
 return simpleInteger = _value;
 }
}

Резюме:

В этой статье я сосредоточился в первую очередь на смарт-контрактах, различных способах создания экземпляра и всех связанных с ними важных объектно-ориентированных концепциях, включая наследование, полиморфизм, абстракцию и инкапсуляцию.

В Solidity можно реализовать несколько типов наследования. Обсуждались простое,
множественное, иерархическое и многоуровневое наследование, а также использование и реализация абстрактных контрактов и интерфейсов. Следует отметить, что при использовании наследования в Solidity в конечном итоге развертывается только один контракт вместо нескольких контрактов. Есть только один адрес, который может использоваться любым контрактом с иерархией родитель-потомок.