Typ abstrakcyjny - Abstract type

W języków programowania , abstrakcyjny typ to typ w mianowniku typu systemu , który nie może być instancja bezpośrednio; typ, który nie jest abstrakcyjny – który może być konkretyzowany – 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 zapewnić brak implementacji lub implementację niekompletną. 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 dostarczanych oddzielnie, na przykład w postaci konkretnych podtypów, które można utworzyć. W programowaniu obiektowym klasa abstrakcyjna może zawierać metody abstrakcyjne lub właściwości abstrakcyjne współdzielone przez jej podklasy. Inne nazwy cech języka, które są (lub mogą być) używane do implementacji typów abstrakcyjnych, obejmują cechy , domieszki , smaki , role lub klasy typów .

Znaczące typy abstrakcyjne

Klasy abstrakcyjne można tworzyć, oznaczać lub symulować na kilka sposobów:

  • Używając słowa kluczowego explicit abstractw definicji klasy, tak jak w Java , D lub C# .
  • Poprzez uwzględnienie w definicji klasy jednej lub więcej metod abstrakcyjnych (nazywanych czystymi funkcjami wirtualnymi w C++ ), które klasa jest zadeklarowana do zaakceptowania jako część swojego protokołu, ale dla których nie podano implementacji.
  • Przez dziedziczenie z abstrakcyjnego typu, a nie nadrzędnymi wszystkie brakujące funkcje niezbędne do uzupełnienia definicji klasy. Innymi słowy, typ potomny, który nie implementuje wszystkich metod abstrakcyjnych ze swojego rodzica, sam staje się abstrakcyjny.
  • W wielu dynamicznie typowanych językach, takich jak Smalltalk , każda klasa, która wysyła konkretną metodę do this , ale nie implementuje tej metody, może być uważana za abstrakcyjną. (Jednak w wielu takich językach, takich jak Objective-C , błąd nie jest wykrywany, dopóki klasa nie zostanie użyta, a komunikat zwraca komunikat o błędzie wyjątku, taki jak „Nie rozpoznaje selektora: xxx”, który - [NSObject doesNotRecognizeSelector:(SEL)selector]jest wywoływany po wykryciu niewdrożona metoda).

Przykład (Java)

//By default, all methods in all classes are concrete, unless the abstract keyword is used.
abstract class Demo {
    // An abstract class may include abstract methods, which have no implementation.
    abstract public 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 {
    [abstract] int getLength(); //Abstract 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;
    }
}

Korzystanie z typów abstrakcyjnych

Typy abstrakcyjne są ważną funkcją w statycznie typowanych językach OOP. Wiele języków z typowaniem dynamicznym nie ma równoważnej funkcji (chociaż użycie kaczego typowania sprawia, że ​​typy abstrakcyjne są niepotrzebne); jednak cechy można znaleźć w niektórych nowoczesnych językach z typowaniem dynamicznym.

Niektórzy autorzy twierdzą, że klasy powinny być klasami typu liść (nie mają podtypów) lub być abstrakcyjnymi.

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ół.

Typy abstrakcyjne są również istotną częścią wzorca metody szablonu .

Zobacz też

Bibliografia

Dalsza lektura

Linki zewnętrzne