> For the complete documentation index, see [llms.txt](https://opu.gitbook.io/oop/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://opu.gitbook.io/oop/first-term/labs/laboratornaya-rabota-6/abstraktnye-klassy-i-interfeisy-v-uml.md).

# Абстрактные классы и интерфейсы в 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() {}
}
```
