Абстрактный тип - Abstract type

В языки программирования, абстрактный тип это тип в номинативная система типов этого не может быть созданный напрямую; тип, который не является абстрактным - который может быть инстанциированным - называется тип бетона. Каждый экземпляр абстрактного типа является экземпляром некоторого конкретного подтип. Абстрактные типы также известны как экзистенциальные типы.[1]

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

Часто абстрактные типы имеют одну или несколько реализаций, предоставляемых отдельно, например, в форме конкретных подтипов, которые может быть экземпляром. В объектно-ориентированном программировании абстрактный класс может включать абстрактные методы или же абстрактные свойства[2] которые являются общими для его подклассов. Другие имена для языковых функций, которые используются (или могут использоваться) для реализации абстрактных типов, включают: черты, миксины, ароматы, роли, или же типовые классы.[нужна цитата ]

Обозначение абстрактных типов

Абстрактные классы можно создавать, обозначать или моделировать несколькими способами:

  • Используя явное ключевое слово Абстрактные в определении класса, как в Ява, D или же C #.
  • Включив в определение класса один или несколько абстрактные методы (называется чистый виртуальные функции в C ++ ), который класс объявлен как часть своего протокола, но для которого не предусмотрена реализация.
  • К наследование из абстрактного типа, и не отменять все недостающие функции, необходимые для завершения определения класса. Другими словами, дочерний тип, который не реализует все абстрактные методы своего родителя, сам становится абстрактным.[2][3]
  • Во многих языках с динамической типизацией, таких как Болтовня, любой класс, который отправляет определенный метод в это, но не реализует этот метод, можно считать абстрактным. (Однако во многих таких языках, например Цель-C, ошибка не обнаруживается до тех пор, пока класс не будет использован, и сообщение возвращает результаты в виде сообщения об ошибке исключения, такого как «Не распознает селектор: xxx» как - [NSObject doesNotRecognizeSelector: (SEL) селектор] вызывается при обнаружении нереализованного метода).

Пример (Java)

// По умолчанию все методы во всех классах являются конкретными, если не используется ключевое слово abstract.Абстрактные учебный класс Демо {    // Абстрактный класс может включать абстрактные методы, у которых нет реализации.    Абстрактные общественный int сумма(int Икс, int у);    // Абстрактный класс может также включать в себя конкретные методы.    общественный int товар(int Икс, int у) { возвращаться Икс*у; }}// По умолчанию все методы во всех интерфейсах являются абстрактными, если не используется ключевое слово default.интерфейс ДемоИнтерфейс {    [Абстрактные] int getLength(); // Здесь можно использовать абстракцию, но она совершенно бесполезна        // Ключевое слово по умолчанию может использоваться в этом контексте для указания конкретного метода в интерфейсе    дефолт int товар(int Икс, int у) {        возвращаться Икс * у;    }}

Использование абстрактных типов

Абстрактные типы - важная особенность в статически типизированный Языки ООП. Много динамически типизированный у языков нет эквивалентной функции (хотя использование утка печатать делает ненужными абстрактные типы); тем не мение черты встречаются в некоторых современных языках с динамической типизацией.[нужна цитата ]

Некоторые авторы утверждают, что занятия должны быть листовые классы (не иметь подтипов) или быть абстрактным.[4][5]

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

Абстрактные типы также являются важной частью Шаблон метода шаблона.

Смотрите также

Рекомендации

  1. ^ Митчелл, Джон С .; Плоткин, Гордон Д .; Абстрактные типы имеют экзистенциальный тип, Транзакции ACM по языкам и системам программирования, Вып. 10, No. 3, июль 1988 г., стр. 470–502.
  2. ^ а б «Абстрактные методы и классы (Руководства по Java ™> Изучение языка Java> Интерфейсы и наследование)». Oracle.com. Получено 2019-08-14.
  3. ^ «Чистые виртуальные функции и абстрактные классы в C ++». GeeksforGeeks.org.
  4. ^ Риэль, Артур (1996). Эвристика объектно-ориентированного дизайна. Эддисон-Уэсли Профессионал. п. 89. ISBN  0-201-63385-X.
  5. ^ Мейерс, Скотт (1996). Более эффективный C ++. Эддисон-Уэсли Профессионал. п.258. ISBN  0-201-63371-X. Сделать нелистовые классы абстрактными

дальнейшее чтение

внешняя ссылка