> For the complete documentation index, see [llms.txt](https://lifeexe-art.gitbook.io/unreal-engine-c-course/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lifeexe-art.gitbook.io/unreal-engine-c-course/voprosy-i-otvety/chto-takoe-interfeisy.md).

# Что такое интерфейсы

{% hint style="info" %}
&#x20;**В курсе не затронута тема использования интерфейсов. Вы ими не пользуетесь? Если да то почему?**
{% endhint %}

Пользуюсь, но также их нужно применять с умом. Если есть выбор и можно проблему решить без их использования, например, через композицию (с использованием компонента), то предпочитаю этот способ.

В курсе не нашлось подходящего примера (подумаю над тем, чтобы добавить).

Можно, например, применить при расширении системы пикапов и оружия. Создать интерфейс **ITakable** и реализовать его в классе оружия и других пикапов. Это позволит нам создать систему подбора оружия (и также при смерти персонажа можно не уничтожать оружие, а делать детач всех объектов **ASTUBaseWeapon** в функции **EndPlay** и дополнительно активировать физику у объектов оружия для эффектности).

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

Например, у нас могут быть объекты: **дверь, книга, телефон** и другие, с которыми каким то образом умеет взаимодействовать персонаж. И допустим по нажатию на клавишу **Enter**, игрок хочет взаимодействовать с объектом.

Мы определяем интерфейс (псевдокод):&#x20;

```cpp
UINTERFACE(MinimalAPI, Blueprintable)
class UIntractableInterface : public UInterface
{    
    GENERATED_BODY()
}; 

class IIntractableInterface
{        
    GENERATED_BODY()
     
    public:  
        bool Interact(){}
};
```

И реализуем его в соответствующих классах, добавляя необходимую логику:

```cpp
class ADoorActor : public AActor, public IIntractableInterface
{
  public:    
      bool Interact(){/* open a door */}	
};

class ABook : public AActor, public IIntractableInterface
{
  public:    
      bool Interact(){/* read a book */}
}; 

class APhone : public AActor, public IIntractableInterface
{
  public:    
      bool Interact(){/* call the police */}
};
```

Далее мы получаем указатель на объект **AActor,** с которым хочет взаимодействовать пользователь (через какой-нибудь trace например). Проверяем, реализует ли он интерфейс **Interactable** и если да, то вызываем функцию **Interact**. Таким образом, каждый объект запустит своё конкретное поведение:

```
IIntractableInterface* InteractableActor = Cast<IIntractableInterface>(SomeActor);
if(InteractableActor)
{    
    InteractableActor->Interact();
}
```

Почитать про использование интерфейсов в **Unreal Engine** и посмотреть примеры можно по [ссылке](https://docs.unrealengine.com/en-US/ProgrammingAndScripting/GameplayArchitecture/Interfaces/index.html).
