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

{% 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).


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lifeexe-art.gitbook.io/unreal-engine-c-course/voprosy-i-otvety/chto-takoe-interfeisy.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
