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