|
20 | 20 | - [Наследник: Круг {#наследник-круг}](#наследник-круг-наследник-круг) |
21 | 21 | - [Наследник: Прямоугольник {#наследник-прямоугольник}](#наследник-прямоугольник-наследник-прямоугольник) |
22 | 22 | - [Полиморфизм в массиве фигур {#полиморфизм-в-массиве-фигур}](#полиморфизм-в-массиве-фигур-полиморфизм-в-массиве-фигур) |
| 23 | + - [Интерфейсы {#интерфейсы}](#интерфейсы-интерфейсы) |
| 24 | + - [Базовый интерфейс: ОбработчикЗапроса {#базовый-интерфейс-обработчикзапроса}](#базовый-интерфейс-обработчикзапроса-базовый-интерфейс-обработчикзапроса) |
| 25 | + - [Реализация интерфейса: СвойОбработчикЗапросов {#реализация-интерфейса-свойобработчикзапросов}](#реализация-интерфейса-свойобработчикзапросов-реализация-интерфейса-свойобработчикзапросов) |
| 26 | + - [Использование интерфейса {#использование-интерфейса}](#использование-интерфейса-использование-интерфейса) |
23 | 27 |
|
24 | 28 | ## Возможности {#возможности} |
25 | 29 |
|
|
429 | 433 | КонецПроцедуры |
430 | 434 | ``` |
431 | 435 |
|
432 | | -В `Круг` импортируется `Фигура`, наследуется через `&Наследует`. Свойство `Радиус` типизировано и защищено. Метод `Площадь()` переопределяет базовый, вычисляя площадь по формуле π\*r², возвращая `&Число`. Конструктор вызывает `Базовый.Конструктор()` для инициализации родительских свойств. |
| 436 | +В `Круг` импортируется `Фигура`, наследуется через `&Наследует`. Свойство `Радиус` типизировано и защищено. Метод `Площадь()` переопределяет базовый, вычисляя площадь по формуле π*r², возвращая `&Число`. Конструктор вызывает `Базовый.Конструктор()` для инициализации родительских свойств. |
433 | 437 |
|
434 | 438 | #### Наследник: Прямоугольник {#наследник-прямоугольник} |
435 | 439 |
|
|
459 | 463 | КонецПроцедуры |
460 | 464 | ``` |
461 | 465 |
|
462 | | -Аналогично `Круг`, но с двумя свойствами `Ширина` и `Высота`. `Площадь()` вычисляет ширину \* высоту. Показан комментарий о возможном вызове `Базовый.Площадь()` для демонстрации доступа к родительским методам. |
| 466 | +Аналогично `Круг`, но с двумя свойствами `Ширина` и `Высота`. `Площадь()` вычисляет ширину * высоту. Показан комментарий о возможном вызове `Базовый.Площадь()` для демонстрации доступа к родительским методам. |
463 | 467 |
|
464 | 468 | #### Полиморфизм в массиве фигур {#полиморфизм-в-массиве-фигур} |
465 | 469 |
|
|
500 | 504 | Как вы можете наблюдать, аннотации типов всегда прописываются перед ключевыми словами: `Перем`, `Функция`, и перед названиями параметров. Это не обязательно, просто код так выглядит чище. Самое главное — чтобы аннотация типа была самой последней. |
501 | 505 |
|
502 | 506 | [↑ В начало](#оглавление) |
| 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