Typ abstrakcyjny

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

Linki zewnętrzne