Typ abstrakcyjny
Systemy typów |
---|
Pojęcia ogólne |
Główne kategorie |
Kategorie drugorzędne |
W językach programowania typ abstrakcyjny to typ w systemie typów mianownikowych , którego nie można utworzyć bezpośrednio; typ, który nie jest abstrakcyjny — który można utworzyć — nazywany jest typem konkretnym . Każda instancja typu abstrakcyjnego jest instancją jakiegoś konkretnego podtypu . Typy abstrakcyjne są również znane jako typy egzystencjalne .
Typ abstrakcyjny może nie zapewniać żadnej implementacji lub implementacji niekompletnej. W niektórych językach typy abstrakcyjne bez implementacji (zamiast implementacji niekompletnej) są znane jako protokoły , interfejsy , sygnatury lub typy klas . W programowaniu obiektowym opartym na klasach typy abstrakcyjne są implementowane jako klasy abstrakcyjne (znane również jako abstrakcyjne klasy bazowe ), a typy konkretne jako klasy konkretne . W programowaniu generycznym analogicznym pojęciem jest pojęcie , które podobnie określa składnię i semantykę, ale nie wymaga relacji podtypu: dwa niepowiązane typy mogą spełniać to samo pojęcie.
Często typy abstrakcyjne będą miały jedną lub więcej implementacji dostarczonych oddzielnie, na przykład w postaci konkretnych podtypów, które można utworzyć. W programowaniu obiektowym klasa abstrakcyjna może zawierać abstrakcyjne metody lub abstrakcyjne właściwości , które są wspólne dla jej podklas. Inne nazwy funkcji językowych, które są (lub mogą być) używane do implementacji typów abstrakcyjnych, obejmują cechy , domieszki , smaki , role lub klasy typów . [ potrzebne źródło ]
Znaczące typy abstrakcyjne
Klasy abstrakcyjne można tworzyć, oznaczać lub symulować na kilka sposobów:
- Używając jawnego słowa kluczowego
abstract
w definicji klasy, jak w Javie , D lub C# . - Poprzez włączenie do definicji klasy jednej lub więcej metod abstrakcyjnych (nazywanych czystymi funkcjami wirtualnymi w C++ ), które klasa ma akceptować jako część swojego protokołu, ale dla których nie zapewniono żadnej implementacji.
- Dziedzicząc z typu abstrakcyjnego i nie nadpisując wszystkich brakujących funkcji niezbędnych do uzupełnienia definicji klasy. Innymi słowy, typ potomny, który nie implementuje wszystkich abstrakcyjnych metod swojego rodzica, sam staje się abstrakcyjny.
- W wielu dynamicznie typowanych językach, takich jak Smalltalk , każda klasa, która wysyła określoną metodę do this , ale nie implementuje tej metody, może być uznana za abstrakcyjną. (Jednak w wielu takich językach, takich jak Objective-C , błąd nie jest wykrywany, dopóki klasa nie jest używana, a komunikat zwraca komunikat o błędzie wyjątku, taki jak „Nie rozpoznaje selektora: xxx” jako - [
NSObject doesNotRecognizeSelector: (SEL)selector]
jest wywoływany po wykryciu niezaimplementowanej metody).
Przykład (Java)
//Domyślnie wszystkie metody we wszystkich klasach są konkretne, chyba że użyto słowa kluczowego abstract. Klasa abstrakcyjna Demo { // Klasa abstrakcyjna może zawierać metody abstrakcyjne, które nie mają implementacji. abstrakcyjna publiczna suma int ( int x , int y ); // Klasa abstrakcyjna może również zawierać konkretne metody. public int iloczyn ( int x , int y ) { return x * y ; } } //Domyślnie wszystkie metody we wszystkich interfejsach są abstrakcyjne, chyba że użyto słowa kluczowego default. interfejs DemoInterface { [ streszczenie ] int getLength (); //Abstract może być tu użyty, ale jest całkowicie bezużyteczny //W tym kontekście słowo kluczowe default może być użyte do określenia konkretnej metody w interfejsie default int product ( int x , int y ) { return x * y ; } }
Użycie typów abstrakcyjnych
Typy abstrakcyjne są ważną cechą statycznie typowanych języków OOP. Wiele z dynamicznym typowaniem nie ma równoważnej funkcji (chociaż użycie kaczego pisania sprawia, że typy abstrakcyjne są niepotrzebne); jednak cechy można znaleźć w niektórych współczesnych językach pisanych dynamicznie. [ potrzebne źródło ]
Niektórzy autorzy twierdzą, że klasy powinny być klasami liści (nie mają podtypów) lub być abstrakcyjne.
Typy abstrakcyjne są przydatne, ponieważ mogą być używane do definiowania i egzekwowania protokołu ; zestaw operacji, które muszą obsługiwać wszystkie obiekty implementujące protokół. [ potrzebne źródło ]
Typy abstrakcyjne są również istotną częścią Wzorca Metody Szablonowej .
Zobacz też
Dalsza lektura
- Głowa do góry Jawa . Media O'Reilly. 2003. s. 688 . ISBN 0-596-00920-8 .
- Core Java: zintegrowane podejście R. Nageswara Rao
Linki zewnętrzne
- „Wyjaśnienie abstrakcyjnych lub szkieletowych interfejsów” [1]
- Typy i języki programowania autorstwa Benjamina Pierce'a (MIT Press 2002) [2]
- Abstrakcyjna czcionka w Rosetta Code