Jump to content

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

В языках программирования абстрактный тип (также известный как экзистенциальный тип ). [1] — это тип в системе номинативных типов , экземпляр которого не может быть создан напрямую; напротив, конкретный тип может быть создан напрямую. Создание экземпляра абстрактного типа может происходить только косвенно, через конкретный подтип .

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

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

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

Создание [ править ]

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

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

Примеры [ править ]

Ява [ править ]

По умолчанию все методы во всех классах являются конкретными, если не используется ключевое слово Abstract. Абстрактный класс может включать в себя абстрактные методы, не имеющие реализации. По умолчанию все методы во всех интерфейсах являются абстрактными, если не используется ключевое слово default. Ключевое слово по умолчанию можно использовать для указания конкретного метода в интерфейсе.

//By default, all methods in all classes are concrete, unless the abstract keyword is used.
public abstract class Demo {
    // An abstract class may include abstract methods, which have no implementation.
    public abstract int sum(int x, int y);

    // An abstract class may also include concrete methods.
    public int product(int x, int y) { 
        return x*y; 
    }
}

//By default, all methods in all interfaces are abstract, unless the default keyword is used.
interface DemoInterface {
    int getLength(); //The abstract keyword can be used here, though is completely useless
    
    //The default keyword can be used in this context to specify a concrete method in an interface
    default int product(int x, int y) {
        return x * y;
    }
}

Использование [ править ]

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

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

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

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

См. также [ править ]

Ссылки [ править ]

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

Дальнейшее чтение [ править ]

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: de79e4c03926fa86306599cd92ada313__1708525080
URL1:https://arc.ask3.ru/arc/aa/de/13/de79e4c03926fa86306599cd92ada313.html
Заголовок, (Title) документа по адресу, URL1:
Abstract type - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)