Имплементация в программировании это

Оглавление

Интерфейсы в Java и немного о полиморфизме

Интерфейс – это контракт, в рамках которого части программы, зачастую написанные разными людьми, взаимодействуют между собой и со внешними приложениями. Интерфейсы работают со слоями сервисов, безопасности, DAO и т.д. Это позволяет создавать модульные конструкции, в которых для изменения одного элемента не нужно трогать остальные.

Новички часто спрашивают, чем интерфейс отличается от абстрактного класса. Интерфейсы в Java компенсируют отсутствие множественного наследования классов. У класса-потомка может быть только один абстрактный класс-родитель, а вот интерфейсов класс может применять (имплементировать) сколько угодно.

Интерфейс на Java объявляют примерно так же, как и класс:

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

Методы по умолчанию впервые появились в Java 8. Их обозначают модификатором default. В нашем примере это метод say_goodbye, реализация которого прописана прямо в интерфейсе. Дефолтные методы изначально готовы к использованию, но при необходимости их можно переопределять в применяющих интерфейс классах.

Хэппи-энд?

P1956 предлагает переименовать в . Это предложение, вероятно, будет принято в C++20. и тоже переименуют, в std::bit_ceil() and std::bit_floor() соответственно. Их старые названия тоже были не очень, но по другим причинам.

LEWG в Кёльне не выбрала ни , ни в качестве названия для . Эту функцию решили вообще не включать в стандарт. Тот же эффект может быть достигнут эксплицитным созданием массива байтов, поэтому, дескать, функция не нужна. Мне это не нравится, потому что вызов был бы читаемее. Другая всё ещё существует, но теперь называется . Это мне нравится. Она должна войти в C++23.

Разумеется, уже не переименуют — под этим названием она вошла в стандарт ещё в 1998. Но хотя бы исправили, и то неплохо.

Имплементация — это …

Английское слово implementation официально переводится ООН (что это за организация?) как «осуществление». Впервые термин употребил Комитет по правам человека в 1981 году.

Первоначальное значение слова «имплементировать» – претворять что-либо в жизнь.

Например, идею, концепцию, документ.

Сейчас термин в основном применяется в двух сферах:

  1. Юридической.

    С точки зрения права, имплементация – это реализация на внутригосударственном уровне обязательств, закреплённых в международных соглашениях.

    Например, главы двух государств подписывают конвенцию (что это такое?) о правовой помощи по уголовным делам.

    А в дальнейшем стороны предпринимают следующие шаги:

    1. предоставляют своим гражданам и иностранцам равные права при обращении в суд;
    2. возлагают на органы юстиции обязанность исполнять поручения аналогичных органов другой страны;
    3. взаимно признают судебные решения и обеспечивают их исполнение;
    4. организуют розыск и выдачу преступников.

    Учёные-правоведы рассматривают термин в узком и широком значении.

    1. В первом случае имплементация предполагает только включение в национальное законодательство международно-правовых норм.
    2. А в широком смысле это нормотворческая, организационная и правоприменительная деятельность.

      Например, для реализации взятых на себя обязательств государства создают специальные органы, выделяют часть денег из бюджета, сотрудничают с иностранными структурами.

  2. Сфере IT

    А имплементация в программировании – что это? Если говорить простыми словами, выражение технологии, алгоритма или функции в исходном коде.

    По сути, имплементировать – это реализовывать в ПО какой-либо функционал.

Интерфейсы и полиморфизм

Пример выше иллюстрирует один из трех основополагающих принципов ООП — полиморфизм. Мы раскрыли одно и то же явление — съедобность — через несколько классов, свойства и методы которых частично отличаются. Представление разных форм одного явления — это и есть полиморфизм. Если нужно, такую систему всегда можно расширить и скорректировать. В нашем случае — добавить новые виды съестного и методы их приготовления.

В Java полиморфизм можно реализовать через:

  • наследование — с переопределением параметров и методов базового класса;
  • абстрактные классы — шаблоны для раздельной реализации в разных классах;
  • интерфейсы — для имплементации классами.

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

DRY (Don’t Repeat Yourself)

Переводится как «не повторяйся» и буквально означает, что нужно уходить от дублирующего кода и по возможности использовать абстракцию для общих вещей.

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

Но важно не злоупотреблять этим принципом. Например, один и тот же код не подойдёт для проверки OrderId и SSN

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

Ключевое слово extends в Java

Действие ключевого слова в точности совпадает с его переводом, один класс расширяет другой, что является классическим наследованием. Правила видимости полей и методов сохранились: private доступны только в самом классе, protected в самом классе и во всех наследниках, к public методам и полям можно обращаться откуда угодно. Главное отличие от «сишного» наследования в том, что можно расширять только один класс. Я сейчас не буду рассуждать о том, насколько это удобно, скажу только, что со множественным наследованием в C++ постоянно творилась какая-то каша.

Небольшой пример наследования с помощью ключевого слова extends. Напишем класс Door, который будет описывать характеристики двери, мы можем создать объект этого класса и работать с ним, как с «просто дверью». С другой стороны напишем еще два класса: IronDoor и WoodDoor, которые будут расширять класс Door(== наследуются от класса Door), т.е. добавят свои характеристики к базовым.


//Базовый класс "дверь"
public class Door  {
    //Допустим, что у любой двери есть цена
    protected int price;

    //Этот метод тоже наследуется
    protected void doSomething() {
        System.out.println("Door is doing something");
    }

    //Этот метод доступен исключительно в классе Door
    private void onlyForDoor() {

    }
}

//Железная дверь
public class IronDoor extends Door {
    //Уровень защиты определен только для железных дверей
    private int protectionLvl;

    IronDoor(int price, int protectionLvl) {
        this.price = price;
        this.protectionLvl = protectionLvl;
    }
}

//Деревянная дверь
public class WoodDoor extends Door {
    //Характеристика "порода древесины" доступна только деревянной двери
    private String woodType;

    WoodDoor(int price, String woodType) {
        this.price = price;
        this.woodType = woodType;
    }
}

Функциональный интерфейс Java

Если у интерфейса только один абстрактный метод, перед нами функциональный интерфейс. Его принято помечать аннотацией @FunctionalInterface, которая указывает компилятору, что при обнаружении второго абстрактного метода в этом интерфейсе нужно сообщить об ошибке. Стандартных (default) методов у интерфейса может быть множество – в том числе принадлежащих классу java.lang.Object.

Как выглядит функциональный интерфейс на Java:

Функциональные интерфейсы появились в Java 8. Они обеспечили поддержку лямбда-выражений, использование которых делает код лаконичным и понятным:

В той же версии появились пакеты встроенных интерфейсов: java.util.function и java.util.stream.

Инкапсуляция изменяющегося кода

Сервисы стремительно развиваются. Продакшн подразумевает постоянные изменения кода и его поддержку. Отсюда следует второй принцип ООП — инкапсуляция кода, который с большой вероятностью будет изменён в будущем.

Преимущество этого принципа ООП заключается в том, что инкапсулированный код легко тестировать и поддерживать.

Воспользуйтесь алгоритмом, по которому переменные и методы по умолчанию имеют спецификатор private. Затем шаг за шагом увеличиваете доступ при необходимости (с private на protected, с protected на public).

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

Реализация интерфейсов классами Java

Допустим, есть интерфейс Edible, которым пользуются классы Fruit, Vegetable, Fish. Экземпляры этих классов можно создавать так:

Хорошим тоном считается давать интерфейсам названия с окончанием -able/-ible — это показывает, что с объектами, имплементирующими интерфейс, можно что-то делать: Edible (можно есть), Moveable (можно двигать), Clickable (реагирует на клик) и т.д.

Обратите внимание на разницу в конструкторах: для фруктов задаём название и сорт, для рыбы – название, район вылова и вес порции в граммах. Но ссылки на оба объекта храним в переменных одного типа – «Съестное»

Виды имплементации в международном праве

В большинстве интернет-источников вы найдёте упоминание об инкорпорации, трансформации и отсылке. Однако правоведы выделяют и другие виды имплементации.

В общепринятой классификации критерием служит способ реализации государством международных обязательств.

Имплементация Что это простыми словами
Инкорпорация Дословное воспроизведение текста международно-правовой нормы в национальном нормативном правовом акте.
Трансформация Переработка международно-правовой нормы с учётом местных традиций и последующее её включение в национальное законодательство, изменение действующих и издание новых официальных документов. Трансформация обычно применяется в тех случаях, когда требуется сближение регулирования в странах, принадлежащих к разным правовым семьям (например, англо-саксонской и романо-германской).
Отсылка Прямое указание в тексте национального нормативного правового акта на то, что для регулирования конкретного вопроса применяется международное соглашение.
Рецепция Заимствование нормотворческими органами успешного правового опыта зарубежных стран со схожими социально-экономическими условиями.
Унификация Сотрудничество государств в целях создания единообразного подхода к правовому регулированию ряда вопросов. Чаще всего унификация применяется в следующих сферах: международной торговли, уголовного права, экологической безопасности.

Некоторые учёные (в частности, В.А.Вдовин) делят имплементацию на общую и специальную.

Общая предполагает лишь констатацию факта применения наднациональных актов для регулирования отношений внутри государства.

Так, в ч. 4 ст. 15 Конституции записано, что составной частью правовой системы выступают общепризнанные принципы и нормы международного права, а также международные договоры РФ.

Специальная имплементация – это изменение текущего национального законодательства. В том числе издание новых нормативных правовых актов и отмена тех, которые противоречат международно-правовым обязательствам государства.

Название имплементации и название результата

Ни одно из перечисленных названий не является, строго говоря, неверным: они все прекрасно описывают то, что делает функция. действительно считает двоичный логарифм и прибавляет к нему единицу; имплицитно создаёт объекты, а частично сортирует контейнер и копирует результат. Тем не менее, все эти названия мне не нравятся, потому что они бесполезны.

Ни один программист не сидит и не думает “вот бы мне взять двоичный логарифм, да прибавить бы к нему единицу”. Ему нужно знать, во сколько бит поместится данное значение, и он безуспешно ищет в доках что-нибудь типа . К моменту, когда до пользователя библиотеки доходит, при чём тут вообще двоичный логарифм, он уже написал свою имплементацию (и, скорее всего, пропустил проверку для ноля). Даже если каким-то чудом в коде оказалось , следующий, кто увидит этот код, опять должен понять, что это и зачем оно нужно. У такой проблемы бы не было.

Точно так же никому не надо “имплицитно создавать объекты” или “проводить частичную сортировку копии вектора” — им нужно переиспользовать память или получить 5 наибольших значений в порядке убывания. Что-то типа (что тоже предлагали в качестве названия ) и было бы гораздо понятнее.

Кейт использует термин название имплементации для , но он прекрасно подходит и к двум другим функциям. Имплементацию их названия действительно описывают идеально. Вот только пользователю нужно название результата — то, что он получит, вызвав функцию. До её внутреннего устройства ему нет никакого дела, он просто хочет узнать размер в битах или переиспользовать память.

Называть функцию на основании её спецификации — значит создавать на ровном месте непонимание между разработчиком библиотеки и её пользователем. Всегда нужно помнить, когда и как функция будет использоваться.

Звучит банально, да. Но, судя по , это далеко не всем очевидно. К тому же порой всё не так просто.

Композиция вместо наследования

Существует два основных способа повторного использования кода: наследование и композиция. Оба они имеют свои преимущества и недостатки, но, как правило, предпочтение рекомендуется отдавать последнему, если это возможно. Обусловлено это тем, что композиция гибче наследования.

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

«Effective Java» Джошуа Блоха также советует отдавать предпочтение композиции вместо наследования. Если вы всё ещё не уверены, вы также можете посмотреть здесь, чтобы узнать, почему композиция лучше, чем наследование для повторного использования кода и его функциональности.

Пример 4: std::popcount()

, как и , в C++20 предлагается добавить в . И это, разумеется, чудовищно плохое название. Если не знать, что эта функция делает, догадаться невозможно. Мало того, что сокращение сбивает с толку (pop в названии есть, но pop/push тут ни при чём) — расшифровка population count (подсчёт населения? число популяций?) тоже не помогает.

С другой стороны, идеально подходит для этой функции, потому что она вызывает ассемблерную инструкцию popcount. Это не то что название имплементации — это полное её описание.

Тем не менее, в данном случае разрыв между разработчиками языка и программистами не так уж и велик. Инструкция, считающая количество единиц в двоичном слове, называется popcount с шестидесятых. Для человека, хоть сколько-нибудь разбирающегося в операциях с битами, такое название абсолютно очевидно.

Кстати, хороший вопрос: придумывать ли названия, удобные для новичков, или оставить привычные для олдфагов?

Какое право важнее: международное или национальное

Ответ на этот вопрос зависит от правовых традиций конкретной страны. Большинство правоведов считают, что в будущем процессы глобализации только усилятся.

На первый план выйдут проблемы, решение которых требует совместных усилий:

  1. транснациональная преступность;
  2. экологическая и техногенная безопасность;
  3. предотвращение вооружённых конфликтов;
  4. защита прав человека.

Это приведёт к превалированию международных норм права над национальными. Уже сейчас многие страны закрепили в основных законах положение о таком приоритете (это как?).

Согласно Конституции РФ, в случае противоречия закона и международного договора должны применяться положения последнего. Поэтому многие юристы пришли к выводу о примате международного права над национальным.

Однако в июле 2015 года Конституционный Суд РФ изложил в своём постановлении противоположную точку зрения. Он написал, что государство в порядке исключения вправе отступить от исполнения возлагаемых на него обязательств, если такое отступление является единственно возможным вариантом избежать нарушения основополагающих принципов и норм Конституции.

Большой толковый словарь

ИМИТИРОВАТЬ, -рую, -руешь; нсв. 1. Искусно подражать кому-, чему-л., воспроизводить с точностью, подделываясь под кого-, что-л. И. знакомых. И. голоса животных. // Подделать что-л. с целью введения в заблуждение кого-л. И. бегство. И. оборону. 2. Воспроизводить с возможной точностью какие-л. процессы, образцы и т. п. И. разворот корабля. И. перегрузки на центрифуге. Вибростенд имитирует содрогание корабля. 3. (св. сымитировать). Делать имитации (2 зн.). И. жемчуг. 4. Муз. Повторять музыкальную тему или мотив в другом голосе на какой-л. интервал выше или ниже. Пианист имитировал тему. Имитироваться, -руется; страд. Красное дерево имитируется. Мрамор имитируется деревом. На тренажёрах имитируются условия космического полёта. Имитирование, -я; ср. ИМПЛАНТИРОВАТЬ, -рую, -руешь; имплантированный; -ван, -а, -о; св. и нсв. что (кому). Провести — проводить имплантацию. И. биодатчик, электростимулятор. И. орган.в зн. прил. Имплантированное сердце (вживлённое в организм человека). ИМПЛЕМЕНТИРОВАТЬ, -рую, -руешь; имплементированный; -ван, -а, -о; св. и нсв. что (кому). Книжн. 1. что. Ввести — вводить в действие, обеспечить — обеспечивать исполнение чего-л. Принять имплементирующий закон. 2. кого, что. Встроить — встраивать в существующую систему, структуру чего-л. И. внесенные предложения в проект постановления. И. новую функцию в работающую программу. И. получаемый опыт в исследование. Имплементация, -и; ж. Юрид. И. норм международного права в национальное законодательство. ИМПОРТИРОВАТЬ, -рую, -руешь; импортированный; -ван, -а, -о; св. и нсв. что. Ввезти — ввозить из-за границы товары. И. хлеб. И. сырьё. Импортироваться, -руется; страд. Ананасы импортируются из Мексики.

Словарь антонимов

ВВОЗ — ВЫВОЗВвоз товаров — вывоз товаров. Ο Из двух задач, какие Петр поставил себе в устроении внешней торговли, успешно разрешена была одна: русский ввоз получил значительное преобладание над вывозом. Ключевский. Курс русской истории. Предметы вывоза из Греции далеко не равнялись ценою с предметами ввоза. Грановский. Чтения Нибура о древней истории. Чем сильнее вывоз перевешивает ввоз, тем радостнее бьются патриотические сердца экономистов. Писарев. Зарождение культуры.ИМПОРТ — ЭКСПОРТИмпортер — экспортеримпортный — экспортныйимпортировать — экспортироватьИмпорт товаров — экспорт товаров. Ο Экспорт стран служит источником валютных поступлений, идущих на оплату импорта средств производства. БСЭ, 3-е изд., т. 5, с. 160. Если импорт капитала как бы замыкает систему межнациональных связей шведского финансового мира, то его экспорт — наиболее типичная форма проявления интернационализации хозяйственной жизни страны. Правда, 14 акт. 1976.

Имплементация миксин на плюсах

Advanced: Тема повышенной сложности или важная.

  • Paltr
  • Постоялец

Доброго времени суток.

Написал удобную имплементацию миксин — решил выложить, может кому поможет. Собственно хедер: Mixines.h (пока без комментариев).

То есть в примере объявлен интерфейс, который надо реализовать. Далее описываются миксины и делается генератор реализаций интерфейса PhysPointImplGenerator. И используя этот генератор мы можем подменить любую часть реализации интерфейса, при этом компилятор сам поймет, какую часть реализации требуется подменить.

В принципе это только один из вариантов использования.

  • kas
  • Постоялец
  • Paltr
  • Постоялец

kas Я так понимаю намек на скорость компиляции. Если да — то именно здесь это не должно быть проблемой, т. к. в основном работа предполагается с интерфейсом, а имплементация легко за PIMPL в cpp скрывается.

  • Paltr
  • Постоялец

В общем, в новой версии не надо регистрировать миксины. но видимо оно никому не интересно. =

  • Nomad
  • Забанен

Paltr Что это такое хоть, твой миксин?

  • Paltr
  • Постоялец

Крайне полезная, ИМХО, вещь но на плюсах ее нет.

  • Suslik
  • Модератор

пример профита в студию. я так и не придумал, где это может понадобиться.

  • Paltr
  • Постоялец

Suslik Мне оно сейчас надо для реализации Steering Behavior. Самое оно описать все поведение персонажа в пятнадцати строках. А так применение миксинам всегда найдется — не зря они некоторыми хорошими языками нативно поддерживаются =).

  • Suslik
  • Модератор

Paltr > Самое оно описать все поведение персонажа в пятнадцати строках > поведение персонажа в пятнадцати строках > ПЯТНАДЦАТИ СТРОКАХ

не, ну правда, приведи какой-нибудь пример, интересно же. можешь из своего нативного, что-нибудь из физикоэнергетических проблем

  • Paltr
  • Постоялец

Suslik > па-бааам! одна строка. Смешно. Я тебе про генерацию реализации интерфейса, ты мне кусок имплементации Steering Behavior. Разумно. Нужен пример — смотри в инете. Если не найдешь, в чем я сомневаюсь, пиши — пример будет.

  • doc.
  • Постоялец

Suslik Короче, это наследуемый(в случае с C++), в некотором роде, обобщенный функционал. Можно несколько развить пример из Wiki. Допустим есть «примесь» с различными перегруженными операторами >, Объясните пожалста, тогда чем это лучше простого шаблонного наследования: Очевидно, ничем. Т.к. изначально миксинов в C++ нет и оно эмулируется именно им. Однако, теперь ты знаешь(и я тоже ) как правильно называются подобные штуки

Еще касательно применения, цитата из Wiki: «Данный метод в более развёрнутом виде используется в библиотеке «Boost operators».»

  • Paltr
  • Постоялец

Suslik > Объясните пожалста, тогда чем это лучше простого шаблонного наследования: А теперь запиши реализацию интерфейса И через 10 миксин (класс А). Это уже неудобно. А потом в получившемся классе подмени одну миксину для того чтобы получить класс Б. Если подменишь — от прошлой все равно останутся «куски» (данные, методы). Альтернатива — вновь наследоваться от интерфейса И и снова описывать 10 миксин реализации. При этом у класса А и Б этот набор отличается лишь на одну миксину. Это из очевидного. Мой вариант подобными недостатками не обладает, да и просто намного гибче и удобней.

Пример 2: std::bless()

Сейчас будет не про названия

Небольшое отступление: в С++ арифметика указателей работает только с указателями на элементы массива. Что, в принципе, логично: в общем случае набор соседних объектов неизвестен и “в десяти байтах справа от переменной ” может оказаться что угодно. Это однозначно неопределённое поведение.

Но такое ограничение объявляет неопределённым поведением огромное количество существующего кода. Например, вот такую упрощённую имплементацию :

Мы выделили память, перенесли все объекты и теперь пытаемся убедиться, что указатели указывают куда надо. Вот только последние три строчки неопределены, потому что содержат арифметические операции над указателями вне массива!

Разумеется, виноват тут не программист. Проблема в самом стандарте C++, который объявляет неопределённым поведением этот очевидно разумный кусок кода. Поэтому P0593 предлагает исправить стандарт, добавив некоторым функциям (вроде и ) способность создавать массивы по мере необходимости. Все созданные ими указатели будут магическим образом становиться указателями на массивы, и с ними можно будет совершать арифметические операции.

Всё ещё не про названия, потерпите секундочку.

Вот только иногда операции над указателями требуются при работе с памятью, которую не выделяла одна из этих функций. Например, функция по сути своей работает с мёртвой памятью, в которой вообще нет никаких объектов, но всё же должна сложить указатель и размер области. На этот случай P0593 предлагал функцию (там была ещё другая функция, которая тоже называется , но речь не о ней). Она не оказывает никакого эффекта на реально существующий физический компьютер, но создаёт для абстрактной машины объекты, которые разрешили бы использовать арифметику указателей.

Название было временным.

Так вот, название.

В Кёльне перед LEWG поставили задачу — придумать для этой функции название. Были предложены варианты и , потому что именно это функция и делает.

Мне эти варианты не понравились.

Принцип подстановки Барбары Лисков (LSP)

Соответствует букве L акронима SOLID. Согласно этому принципу подтипы должны быть заменяемыми для супертипа. Другими словами, методы или функции, работающие с суперклассом, должны иметь возможность без проблем работать также и с его подклассами.

Ивент переехал в онлайн, есть новые даты ( 14 – 15 июля ) , Москва и онлайн, 10 750–138 000 ₽

LSP тесно связан с принципом единственной ответственности и принципом разделения интерфейса.

Если класс реализует больше функциональности, чем подкласс, то последний может не поддерживать некоторые функции и тем самым нарушает данный принцип.

Ниже приведён пример такого кода на Java:

Функция resize() провоцирует неявную ошибку при работе с экземпляром класса Square , потому что позволяет устанавливать отличные друг от друга значения ширины и высоты. Согласно принципу LSP, функции, использующие ссылки на базовые классы, должны иметь возможность использовать объекты производных классов, не зная об этом. Поэтому для корректной работы функция resize() должна проверять, является ли передаваемый объект экземпляром класса Square, и в этом случае не позволять установить разные значения ширины и высоты. Отсюда идёт нарушение принципа.

Ключевое слово implements в Java

С ключевым словом implements связано чуть больше хитростей. Слово «имплементировать» можно понимать, как «реализовывать», а в тот самый момент, когда возникает слово «реализовывать», где-то недалеко появляются интерфейсы. Так вот конструкция public class Door implements Openable означает, что класс дверь реализует интерфейс «открывающийся». Следовательно класс должен переопределить все методы интерфейса. Главная фишка в том, что можно реализовывать сколь угодно много интерфейсов.

Зачем это нужно? Самый простой пример, который приходит в голову, два интерфейса: Openable и Closeble. В первом метод open, и метод close во втором. Они помогут научить нашу дверь закрываться и открываться.

public interface Openable {
    void open();
}

public interface Closeble {
    void close();
}


public class Door implements Openable, Closeble {
    protected int price;

    protected void doSomething() {
        System.out.println("Door is doing something");
    }

    //Реализованные методы
    
    @Override
    public void open() {

    }

    @Override
    public void close() {

    }
}

В классах-потомках двери(железная и деревянная двери) тоже появятся методы открыть/закрыть, реализованные в классе Door. Но никто нам не запрещает их переопределить.

public class IronDoor extends Door {
    private int protectionLvl;

    IronDoor(int price, int protectionLvl) {
        this.price = price;
        this.protectionLvl = protectionLvl;
    }

    //Переопределяем методы
    
    @Override
    public void open() {
        System.out.println("The IRON door is opened");
    }

    @Override
    public void close() {
        System.out.println("The IRON door is closed");
    }
}

Три способа

Понять, что значит «имплементация», поможет изучение способов ее осуществления.

К таким способам относят:

  1. Инкорпорацию.
  2. Трансформацию.
  3. Отсылки: общую, частную, конкретную.

Рассмотрим их:

  • В результате применения способа инкорпорации международные нормы воспроизводятся дословно, без всяких изменений в законодательство государства, которое их имплементирует.
  • В случае трансформации при внедрении международных норм, прописанных в договоре, в национальное законодательство осуществляется некоторая их переработка. Как правило, это практикуется, когда есть необходимость учитывать национальные стандарты юридической техники и правовые традиции.
  • Когда используют отсылки, подразумевается, что содержание международных норм не включается в сам текст закона. В нем лишь содержится указание на них. Тем самым предполагается, что применение национальных правовых норм невозможно без обращения к первоисточнику, то есть к тексту международного документа.

Осуществление норм, установленных международным правом, обеспечивается с помощью различных правовых механизмов. Среди них присутствует различие международно- и национально-правового механизмов внедрения норм. Для того чтобы в полной мере усвоить значение слова «имплементация», рассмотрим их.