Skip to content

Commit 87b425c

Browse files
committed
Реализован функционал интерфейсов
1 parent da139a3 commit 87b425c

File tree

5 files changed

+298
-6
lines changed

5 files changed

+298
-6
lines changed

packagedef

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
Описание.Имя("fint")
2-
.Версия("0.1.2")
2+
.Версия("0.1.3")
33
.Автор("Андрей Савадеров (Macegor)")
44
.АдресАвтора("[email protected]")
55
.Описание("Фреймворк реализующий строгую типизацию, принципы ООП и DI")

readme.md

Lines changed: 97 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020
- [Наследник: Круг {#наследник-круг}](#наследник-круг-наследник-круг)
2121
- [Наследник: Прямоугольник {#наследник-прямоугольник}](#наследник-прямоугольник-наследник-прямоугольник)
2222
- [Полиморфизм в массиве фигур {#полиморфизм-в-массиве-фигур}](#полиморфизм-в-массиве-фигур-полиморфизм-в-массиве-фигур)
23+
- [Интерфейсы {#интерфейсы}](#интерфейсы-интерфейсы)
24+
- [Базовый интерфейс: ОбработчикЗапроса {#базовый-интерфейс-обработчикзапроса}](#базовый-интерфейс-обработчикзапроса-базовый-интерфейс-обработчикзапроса)
25+
- [Реализация интерфейса: СвойОбработчикЗапросов {#реализация-интерфейса-свойобработчикзапросов}](#реализация-интерфейса-свойобработчикзапросов-реализация-интерфейса-свойобработчикзапросов)
26+
- [Использование интерфейса {#использование-интерфейса}](#использование-интерфейса-использование-интерфейса)
2327

2428
## Возможности {#возможности}
2529

@@ -429,7 +433,7 @@
429433
КонецПроцедуры
430434
```
431435

432-
В `Круг` импортируется `Фигура`, наследуется через `&Наследует`. Свойство `Радиус` типизировано и защищено. Метод `Площадь()` переопределяет базовый, вычисляя площадь по формуле π\*r², возвращая `&Число`. Конструктор вызывает `Базовый.Конструктор()` для инициализации родительских свойств.
436+
В `Круг` импортируется `Фигура`, наследуется через `&Наследует`. Свойство `Радиус` типизировано и защищено. Метод `Площадь()` переопределяет базовый, вычисляя площадь по формуле π*r², возвращая `&Число`. Конструктор вызывает `Базовый.Конструктор()` для инициализации родительских свойств.
433437

434438
#### Наследник: Прямоугольник {#наследник-прямоугольник}
435439

@@ -459,7 +463,7 @@
459463
КонецПроцедуры
460464
```
461465

462-
Аналогично `Круг`, но с двумя свойствами `Ширина` и `Высота`. `Площадь()` вычисляет ширину \* высоту. Показан комментарий о возможном вызове `Базовый.Площадь()` для демонстрации доступа к родительским методам.
466+
Аналогично `Круг`, но с двумя свойствами `Ширина` и `Высота`. `Площадь()` вычисляет ширину * высоту. Показан комментарий о возможном вызове `Базовый.Площадь()` для демонстрации доступа к родительским методам.
463467

464468
#### Полиморфизм в массиве фигур {#полиморфизм-в-массиве-фигур}
465469

@@ -500,3 +504,94 @@
500504
Как вы можете наблюдать, аннотации типов всегда прописываются перед ключевыми словами: `Перем`, `Функция`, и перед названиями параметров. Это не обязательно, просто код так выглядит чище. Самое главное — чтобы аннотация типа была самой последней.
501505

502506
[↑ В начало](#оглавление)
507+
508+
### Интерфейсы {#интерфейсы}
509+
510+
Интерфейсы в Fint позволяют определять контракты для классов, обеспечивая полиморфизм без реализации конкретной логики. Интерфейс объявляется аннотацией `&Интерфейс` и содержит абстрактные методы (без тела), которые должны быть реализованы в классах, наследующих интерфейс. Реализация происходит через аннотацию `&Наследует("ИмяИнтерфейса")`, аналогично наследованию от классов. Это позволяет использовать объекты разных классов через общий интерфейс, поддерживая принцип "программируй на интерфейсах".
511+
512+
Интерфейсы полезны для определения поведения, которое должно быть общим для нескольких классов, без привязки к конкретной реализации. Методы интерфейса могут иметь типизацию параметров и возвращаемых значений, обеспечивая строгую типизацию.
513+
514+
#### Базовый интерфейс: ОбработчикЗапроса {#базовый-интерфейс-обработчикзапроса}
515+
516+
Рассмотрим интерфейс `ОбработчикЗапроса` из пространства `fint_web`, который определяет контракт для обработки HTTP-запросов. Он содержит три абстрактных метода: для отправки ответа, отправки ошибки и проверки статуса отправки.
517+
518+
```bsl
519+
&Интерфейс
520+
Перем Этот;
521+
522+
Процедура ОтправитьОтвет() Экспорт
523+
КонецПроцедуры
524+
525+
Процедура ОтправитьОшибку(&Число ТекстОшибки) Экспорт
526+
КонецПроцедуры
527+
528+
&Булево Функция Отправлен() Экспорт
529+
КонецФункции
530+
```
531+
532+
Здесь аннотация `&Интерфейс` указывает, что это интерфейс. Методы объявлены как абстрактные (без тела), с типизацией: `ОтправитьОшибку` принимает параметр типа `&Число`, `Отправлен()` возвращает `&Булево`. Реализация этих методов обязательна в наследующих классах; вызов нереализованного метода приведёт к ошибке.
533+
534+
#### Реализация интерфейса: СвойОбработчикЗапросов {#реализация-интерфейса-свойобработчикзапросов}
535+
536+
Класс `СвойОбработчикЗапросов` реализует интерфейс `ОбработчикЗапроса`. Для этого импортируется пространство `fint_web`, наследуется интерфейс через `&Наследует`, и переопределяются все методы интерфейса.
537+
538+
```bsl
539+
&Импорт("fint_web")
540+
Перем ОбработчикЗапроса;
541+
542+
&Наследует("ОбработчикЗапроса")
543+
Перем Этот, Базовый;
544+
545+
Процедура ОтправитьОтвет() Экспорт
546+
КонецПроцедуры
547+
548+
Процедура ОтправитьОшибку(&Число ТекстОшибки) Экспорт
549+
КонецПроцедуры
550+
551+
&Булево Функция Отправлен() Экспорт
552+
Возврат Истина;
553+
КонецФункции
554+
```
555+
556+
Импорт `fint_web` делает интерфейс доступным. Аннотация `&Наследует("ОбработчикЗапроса")` указывает на реализацию интерфейса. Методы переопределяются: `ОтправитьОтвет()` и `ОтправитьОшибку()` оставлены пустыми (можно добавить логику), `Отправлен()` возвращает `Истина`, соответствуя типизации `&Булево`. Поскольку интерфейс не имеет конструктора, конструктор в реализации опционален. Переменная `Базовый` здесь не используется, так как интерфейс абстрактный, но доступна для будущих расширений.
557+
558+
#### Использование интерфейса {#использование-интерфейса}
559+
560+
Интерфейсы позволяют работать с объектами полиморфно: переменная может хранить экземпляр любого класса, реализующего интерфейс, и вызывать методы через контракт. Это упрощает замену реализаций без изменения кода.
561+
562+
Пример в точке входа или другом классе:
563+
564+
```bsl
565+
&Импорт("fint_web")
566+
Перем ОбработчикЗапроса;
567+
568+
&Импорт
569+
Перем СвойОбработчикЗапросов;
570+
571+
&ТочкаВхода
572+
Перем Этот;
573+
574+
Процедура Конструктор(&ФиксированныйМассив Аргументы) Экспорт
575+
576+
// Создание экземпляра реализации
577+
КонкретныйОбработчик = СвойОбработчикЗапросов.Создать();
578+
579+
// Полиморфное использование: переменная типа интерфейса
580+
Обработчик = КонкретныйОбработчик; // Присваивание реализации
581+
582+
// Вызов методов интерфейса (полиморфизм)
583+
Обработчик.ОтправитьОтвет();
584+
Обработчик.ОтправитьОшибку(500);
585+
586+
Если Обработчик.Отправлен() Тогда
587+
Сообщить("Ответ отправлен успешно");
588+
Иначе
589+
Сообщить("Ответ не отправлен");
590+
КонецЕсли;
591+
592+
КонецПроцедуры
593+
```
594+
595+
Здесь переменная `Обработчик` типизирована как `&ОбработчикЗапроса`, что обеспечивает проверку типов. Создаётся экземпляр `СвойОбработчикЗапросов`, присваивается переменной интерфейса, и вызываются методы. Если добавить другую реализацию (например, `ДругойОбработчик`), код останется неизменным — полиморфизм позволит заменить без рефакторинга. Все вызовы обеспечивают строгую типизацию и инкапсуляцию Fint.
596+
597+
[↑ В начало](#оглавление)

0 commit comments

Comments
 (0)