# Абстрактные классы и интерфейсы в UML

## Абстрактный класс

**Абстрактный класс** - это класс, который нельзя реализовать непосредственно. Вместо этого создается экземпляр подкласса. Обычно абстрактный класс имеет одну или более абстрактных операций. У абстрактной операции нет реализации, это чистое объявление, которые клиенты могут привязать к абстрактному классу.

Наиболее распространенным способом обозначения абстрактного класса или операции в UML является написание их имен курсивом. Можно также сделать свойства абстрактными, определяя абстрактное свойство или методы доступа. Если курсив сложно изобразить (например, если вы рисуете на доске), можно прибегнуть к метке **{abstract}**.

Для указания класса как абстрактного, выделите класс и выделите чекбокс **isAbstract**.

![](https://1377473627-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LnhxGhlv6e_zwoZYywB%2F-MIz6hHJPyAjoiL27Eu1%2F-MIzBlrLWUnIaRKNja-N%2Fimage.png?alt=media\&token=4db38b50-5390-4421-89a9-6497ebc939c8)

Для указания метода как абстрактного, выделите метод и выделите чекбокс **isAbstract**.

![](https://1377473627-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LnhxGhlv6e_zwoZYywB%2F-MIz6hHJPyAjoiL27Eu1%2F-MIzBwA7Ijsr822x2mpI%2Fimage.png?alt=media\&token=7bca47e4-6bd3-44d0-88e4-df3055522a08)

## Интерфейс

**Интерфейс** - это класс, не имеющий реализации, то есть вся его функциональность абстрактна. Интерфейсы прямо соответствуют интерфейсам в Java или C# и являются общей идиомой в других типизированных языках. Интерфейс обозначается стереотипом (ключевым словом) **<\<interface>>**.

### Обозначение интерфейса в StarUML

По умолчанию, при добавлении интерфейса на диаграмму классов, он выглядит как кружок с названием интерфейса.

![](https://1377473627-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LnhxGhlv6e_zwoZYywB%2F-MIz6hHJPyAjoiL27Eu1%2F-MIzAd23-vuZd5G79zmz%2Fimage.png?alt=media\&token=353fc645-f387-404c-855c-4ffd7eeee947)

Для того, чтобы преобразовать его в классический интерфейс согласно стандарту UML, выделите интерфейс и в панели **Editors** выберите **Format -> Label**.

![](https://1377473627-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LnhxGhlv6e_zwoZYywB%2F-MIz6hHJPyAjoiL27Eu1%2F-MIzArF2KRhP_ObIi37T%2Fimage.png?alt=media\&token=f40ebc28-30d0-4288-bf0e-3f45f5cb975e)

После этого снимите выделение с пункта "**Suppress Operations**"

![](https://1377473627-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LnhxGhlv6e_zwoZYywB%2F-MIz6hHJPyAjoiL27Eu1%2F-MIzBYzdYTBLDSr95uM9%2Fimage.png?alt=media\&token=13c681a1-49a8-466c-b5ea-d92570eb35b2)

## Пример использования абстрактного класса и интерфейса

Графическое представление в формате UML

![](https://1377473627-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LnhxGhlv6e_zwoZYywB%2F-MIz6hHJPyAjoiL27Eu1%2F-MIzDeT4oVukHv1UipRZ%2Fimage.png?alt=media\&token=7e73c3e5-353a-40ab-a450-f33635af1c7a)

Исходный код

```java
interface MyInterface{
    void interfaceMethod();
}

abstract class MyAbstractClass implements MyInterface {
    abstract void abstractMethod();
}

class MyClass extends MyAbstractClass {

    @Override
    void abstractMethod() {}

    @Override
    public void interfaceMethod() {}
}
```


---

# 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://opu.gitbook.io/oop/first-term/labs/laboratornaya-rabota-6/abstraktnye-klassy-i-interfeisy-v-uml.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.
