В языках программирования , абстрактный тип является типом в именительной системе типа , которая не может быть реализованной непосредственно; тип, который не является абстрактным, который может быть создан, называется конкретным типом . Каждый экземпляр абстрактного типа является экземпляром некоторого конкретного подтипа . Абстрактные типы также известны как экзистенциальные типы . [1]
Абстрактный тип может не предоставлять реализации или обеспечивать неполную реализацию. В некоторых языках абстрактные типы без реализации (а не с неполной реализацией) известны как протоколы , интерфейсы , сигнатуры или типы классов . В основе классов объектно-ориентированное программирование , абстрактные типы реализуются как абстрактные классы (также известных как абстрактные базовых классы ), а также конкретными типы , как конкретные классы . В универсальном программировании аналогичным понятием является концепция, который аналогичным образом определяет синтаксис и семантику, но не требует отношения подтипов: два несвязанных типа могут удовлетворять одной и той же концепции.
Часто абстрактные типы будут иметь одну или несколько реализаций, предоставляемых отдельно, например, в форме конкретных подтипов, которые могут быть созданы. В объектно-ориентированном программировании абстрактный класс может включать абстрактные методы или абстрактные свойства [2], которые являются общими для его подклассов. Другие имена для языковых функций, которые используются (или могут использоваться) для реализации абстрактных типов, включают черты , миксины , разновидности , роли или классы типов . [ необходима цитата ]
Обозначение абстрактных типов
Абстрактные классы могут быть созданы, обозначены или смоделированы несколькими способами:
- Используя явное ключевое слово абстрактныйв определении класса, как в Java , D или C # .
- Путем включения в определение класса одного или нескольких абстрактных методов (называемых чистыми виртуальными функциями в C ++ ), которые класс объявлен как часть своего протокола, но для которых не предусмотрена реализация.
- При наследовании от абстрактного типа, а не перекрывая все недостающие функции , необходимые для завершения определения класса. Другими словами, дочерний тип, который не реализует все абстрактные методы своего родителя, сам становится абстрактным. [2] [3]
- Во многих языках с динамической типизацией, таких как Smalltalk , любой класс, который отправляет конкретный метод этому , но не реализует этот метод, может считаться абстрактным. (Однако во многих таких языках, как Objective-C , ошибка не обнаруживается до тех пор, пока класс не будет использован, и сообщение возвращает результаты в виде сообщения об ошибке исключения, такого как «Не распознает селектор: xxx»,
- [NSObject doesNotRecognizeSelector:(SEL)selector]
которое вызывается при обнаружении нереализованный метод).
Пример (Java)
// По умолчанию все методы во всех классах являются конкретными, если не используется ключевое слово abstract. абстрактный класс Demo { // Абстрактный класс может включать абстрактные методы, у которых нет реализации. абстрактная публичная int sum ( int x , int y ); // Абстрактный класс также может включать в себя конкретные методы. public int product ( int x , int y ) { return x * y ; } }// По умолчанию все методы во всех интерфейсах являются абстрактными, если не используется ключевое слово default. интерфейс DemoInterface { [ аннотация ] int getLength (); // Здесь можно использовать абстракцию, но она совершенно бесполезна // Ключевое слово default может использоваться в этом контексте для указания конкретного метода в интерфейсе по умолчанию int product ( int x , int y ) { return x * y ; } }
Использование абстрактных типов
Абстрактные типы - важная особенность статически типизированных языков ООП. Многие языки с динамической типизацией не имеют эквивалентной функции (хотя использование утиной печати делает ненужными абстрактные типы); однако черты можно найти в некоторых современных языках с динамической типизацией. [ необходима цитата ]
Некоторые авторы утверждают, что классы должны быть листовыми (не иметь подтипов) или же быть абстрактными. [4] [5]
Абстрактные типы полезны тем, что их можно использовать для определения и обеспечения соблюдения протокола ; набор операций, которые должны поддерживать все объекты, реализующие протокол. [ необходима цитата ]
Абстрактные типы также являются неотъемлемой частью шаблона метода шаблона .
Смотрите также
Рекомендации
- ^ Митчелл, Джон С .; Плоткин, Гордон Д .; Абстрактные типы имеют экзистенциальный тип , ACM-транзакции на языках и системах программирования, Vol. 10, № 3, июль 1988 г., стр. 470–502.
- ^ a b «Абстрактные методы и классы (Учебники по Java ™> Изучение языка Java> Интерфейсы и наследование)» . Oracle.com . Проверено 14 августа 2019 .
- ^ «Чистые виртуальные функции и абстрактные классы в C ++» . GeeksforGeeks.org .
- ^ Риэль, Артур (1996). Эвристика объектно-ориентированного дизайна . Эддисон-Уэсли Профессионал. п. 89. ISBN 0-201-63385-X.
- ^ Мейерс, Скотт (1996). Более эффективный C ++ . Эддисон-Уэсли Профессионал. п. 258 . ISBN 0-201-63371-X.
Сделайте нелистовые классы абстрактными
дальнейшее чтение
- Начни сначала Java . O'Reilly Media. 2003. С. 688 . ISBN 0-596-00920-8.
- Ядро Java: интегрированный подход Р. Нагешвара Рао
Внешние ссылки
- «Объяснение абстрактных или скелетных интерфейсов» [1]
- Типы и языки программирования Бенджамина Пирса (MIT Press, 2002) [2]
- Абстрактный шрифт в Rosetta Code