Абстрактный тип - 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]
Абстрактные типы полезны тем, что их можно использовать для определения и обеспечения соблюдения протокол; набор операций, которые должны поддерживать все объекты, реализующие протокол.[нужна цитата ]
Абстрактные типы также являются важной частью Шаблон метода шаблона.
Смотрите также
Рекомендации
- ^ Митчелл, Джон С .; Плоткин, Гордон Д .; Абстрактные типы имеют экзистенциальный тип, Транзакции ACM по языкам и системам программирования, Вып. 10, No. 3, июль 1988 г., стр. 470–502.
- ^ а б «Абстрактные методы и классы (Руководства по Java ™> Изучение языка Java> Интерфейсы и наследование)». Oracle.com. Получено 2019-08-14.
- ^ «Чистые виртуальные функции и абстрактные классы в C ++». GeeksforGeeks.org.
- ^ Риэль, Артур (1996). Эвристика объектно-ориентированного дизайна. Эддисон-Уэсли Профессионал. п. 89. ISBN 0-201-63385-X.
- ^ Мейерс, Скотт (1996). Более эффективный C ++. Эддисон-Уэсли Профессионал. п.258. ISBN 0-201-63371-X.
Сделать нелистовые классы абстрактными
дальнейшее чтение
- Head First Java. O'Reilly Media. 2003. С.688. ISBN 0-596-00920-8.
- Ядро Java: комплексный подход Р. Нагешвара Рао
внешняя ссылка
- «Объяснение абстрактных или скелетных интерфейсов» [1]
- Типы и языки программирования Бенджамин Пирс (MIT Press, 2002) [2]
- Абстрактный тип в Код Розетты