Omawiając pytanie dotyczące funkcji wirtualnych w przepełnieniu stosu, zastanawiałem się, czy istnieje jakieś oficjalne nazewnictwo dla czystych (abstrakcyjnych) i nieczystych funkcji wirtualnych.
W moich informacjach zawsze polegałem na wikipedii, która stwierdza, że ogólne i nieczyste funkcje wirtualne są ogólnym terminem. Niestety w artykule nie ma kopii zapasowej źródła ani referencji.
Cytując odpowiedź Jona Skeeta na moją odpowiedź, że ogólny i nieoczyszczony to ogólny termin:
@Steven: Hmm ... prawdopodobnie, ale kiedykolwiek widziałem to tylko w kontekście C ++. Podejrzewam, że ktokolwiek o nich mówi, prawdopodobnie ma doświadczenie w C ++ :)
Czy te terminy pochodzą z C ++, czy też zostały po raz pierwszy zdefiniowane lub zaimplementowane we wcześniejszym języku i czy są to „oficjalne” terminy naukowe?
AKTUALIZACJA:
Frank Shearar udzielił pomocnego linku do opisu SIMULA 67 Common Base Language (1970). Ten język wydaje się być pierwszym językiem, który wprowadza słowa kluczowe OO jako klasę , obiekt , a także wirtualny jako pojęcie formalne. To nie definiują czysta / non-pure lub abstrakcyjny , ale to nie obsługuje pojęć .
Kto je zdefiniował?
źródło
Odpowiedzi:
Nygaard i Dahl po raz pierwszy użyli tego terminu, w SIMULA 67 Common Basic Language . Patrz na przykład sekcja 2.1 i sekcja 2.2.3. (O ile mogę przynajmniej powiedzieć. Ale hej, jeśli chodzi o OOP, to prawdopodobnie pierwsze użycie tego terminu.)
źródło
Więc ... Robię małe badania. Poniżej znajduje się krótka lekcja historii dla zainteresowanych. :) Przejdź do konkluzji na dole, jeśli interesuje Cię tylko odpowiedź.
1967 :
SIMULA 67 , pierwszy obiektowy język programowania, definiuje słowa kluczowe jako klasę , obiekt , wywołanie przez odniesienie , wywołanie według wartości i wirtualny .
System dziedziczenia SIMULA był pierwotnie znany pod inną nazwą, konkatenacją (a później znany jako prefiks ), odnosząc się do faktu, że kod nadtypów został skopiowany i „połączony” z kodem podtypów. Później pojawiła się inna forma systemu dziedziczenia , delegacja , w której połączenia są delegowane przez odniesienie do odpowiedniego typu.
Wirtualny najprawdopodobniej odnosi się do procesu, który należy wykonać, aby wywołać wywołanie poprawnej implementacji za pomocą wirtualnej tabeli metod . Jest wirtualny w porównaniu do stałej / konkretnej implementacji.
1971 :
Niklaus Wirth pisze o koncepcji zdefiniowanej jako stopniowe udoskonalanie . Zasadniczo wyjaśnia, jak podzielić program na częściowe rozwiązania, które można rozszerzyć.
1974 :
To pierwszy znaleziony przeze mnie artykuł, w którym ujęto termin abstrakcyjne typy danych autorstwa Barbary Liskov .
W tym dokumencie zdefiniowano także klaster operacji, który wydaje się określać to, co obecnie znamy jako interfejs .
Interesująca terminologia naukowa (artykuł z 1996 r.):
Dziedziczenie : mechanizm niskiego poziomu, za pomocą którego obiekty lub klasy mogą współdzielić zachowanie lub dane.
Subtyping : wyraża specjalizację koncepcyjną. Szczególna forma dziedziczenia, zwana także dziedziczeniem interfejsu .
Zasady abstrakcji : proces organizowania naszej wiedzy na temat dziedziny aplikacji w hierarchiczne rankingi kolejności abstrakcji w celu lepszego zrozumienia omawianych zjawisk.
Częściowo wdrożone abstrakcje : abstrakcje, których definicje celowo pozostawiono niekompletne.
Klasy abstrakcyjne : Określenie specyficzne dla częściowo zaimplementowanej klasy w systemach obiektowych.
Nieograniczone dziedziczenie : umożliwia ponowne zdefiniowanie (lub nawet usunięcie) operacji w podklasach.
Ścisłe dziedziczenie : Dziedziczenie zgodne z zachowaniem.
Wniosek :
Klasa abstrakcyjna to najbardziej ogólny termin używany w systemach obiektowych. Wygląda na to, że czyste i nieczyste funkcje wirtualne pochodzą tylko z C ++. Na przykład ten wywiad ze Stroustrupem wydaje się, że wynalazł warunki. Artykuły naukowe używają bardziej ogólnej terminologii.
Wirtualny pochodzi z SIMULA, co powoduje, że jego użycie jest powszechne, ale nie jest to termin ogólny. Definiuje już szczegóły implementacji. Mówienie w kategoriach rodzajów dziedziczenia jest bardziej odpowiednie. Domyślnie nie-wirtualny domyślnie odpowiada ścisłemu dziedziczeniu , natomiast domyślnie wirtualny odpowiada nieograniczonemu dziedziczeniu .
Czy ktoś jest zainteresowany dostosowaniem wpisu na Wikipedii ? :)
źródło
W C ++ funkcje składowe, które są dynamicznie powiązane, a zatem mogą zostać zastąpione przez podklasę, nazywane są „wirtualnymi”. Funkcje wirtualne, które absolutnie muszą zostać zastąpione, nazywane są „czystymi wirtualnymi”. Zauważ, że czysto wirtualna funkcja może mieć ciało, chociaż często nie. Klasa, która ma co najmniej jedną czystą funkcję wirtualną, jest nazywana „abstrakcyjną” i nie można jej tworzyć, tylko na podstawie.
Zgaduję, że powodem, dla którego funkcje wirtualne są nazywane wirtualnymi, jest fakt, że nie wiadomo, która faktyczna funkcja zostanie wywołana w czasie kompilacji. W pewnym sensie wirtualne wywołanie funkcji „nie istnieje” w czasie kompilacji.
Zgaduję również, że powodem, dla którego termin „streszczenie” jest używany dla klasy z czystą funkcją wirtualną, jest to, że nie można mieć żadnych obiektów tej klasy. W pewnym sensie jest to abstrakcyjne pojęcie dalekie od konkretnego świata przedmiotów.
Edycja: inne języki.
Jeśli chodzi o pytanie, jak ogólny jest termin „wirtualny”, oto moje dwa centy. W Smalltalk wszystkie funkcje używają dynamicznego wiązania, więc wszystkie są wirtualne i nie ma potrzeby używania specjalnego terminu ani słowa kluczowego języka. W języku Java, jeśli się nie mylę, kompilator automatycznie decyduje, czy należy zastosować powiązanie dynamiczne, więc w przypadku programisty nie ma rozróżnienia, a zatem nie ma słowa kluczowego „wirtualnego”.
W C ++ konieczne jest rozróżnienie między wirtualnym a niewirtualnym, ponieważ to do programisty należy decyzja, kiedy należy użyć powiązania dynamicznego, aby zaoszczędzić na narzutach, gdy nie są potrzebne.
źródło
dynamic
- która jest rodzajem wirtualnej metody, która wymienia przestrzeń na czas: zajmuje mniej miejsca i jest wolniejsza do wykonania niżvirtual
metody.