W perspektywie języka programowania, co oznacza podtyp? Słyszałem, że „Dziedziczenie nie jest poddziałem”. Jakie są zatem różnice między dziedziczeniem a poddziałem?
W perspektywie języka programowania, co oznacza podtyp? Słyszałem, że „Dziedziczenie nie jest poddziałem”. Jakie są zatem różnice między dziedziczeniem a poddziałem?
Odpowiedzi:
[Nie zastanawiałem się głęboko nad zagadnieniami systemów typu obiektowego, ale powiem, co wiem, aby rozpocząć dyskusję.]
Mówimy, że jest podtypem B, jeśli wszystkie wartości typu A mogą być użyte w każdym kontekście, w którym oczekiwane są wartości typu B. Lub, mówiąc inaczej, -typed wartości mogą „maskarada” jako B -typed wartości.
Jeśli taka maskarada nie stwarza problemów z sprawdzaniem typu, tj Podłączanie wartości typu A, gdzie potrzebne są wartości typu B , nadal sprawdza typ, nazywamy to „podtypem strukturalnym” . Jeśli nie powoduje problemów z zachowaniem, tj. Takie podłączenie nie zmienia oczekiwanego zachowania, wówczas nazywamy to „podtypem behawioralnym” . („Oczekiwane zachowanie” będzie musiało zostać osobno sformalizowane i możliwe jest wiele koncepcji zachowania).
Podtypowanie strukturalne nie zapewnia podtypowania behawioralnego, ponieważ struktura typu może pasować z przyczyn przypadkowych. Jednak zdefiniowanie oczekiwanego zachowania nie jest łatwe. Tak więc wiele języków programowania wykorzystuje punkt pośredni, w którym użytkownik musi zadeklarować, który typ jest podtypem. Jest to określane jako „podtyp nominalny” . Zobacz pytanie o ukryte podtytułydo dyskusji na ten temat. Chodzi o to, że programista musi zapewnić podtypowanie behawioralne dla wszystkich zadeklarowanych podtypów z wykorzystaniem własnej pomysłowości. Język nie może zaoferować żadnej pomocy. Jednak wszystkie zadeklarowane podtypy muszą być co najmniej podtypami strukturalnymi. W przeciwnym razie program nie mógłby wpisać sprawdzania. Język może to zapewnić. (Niektóre języki programowania nie mają wystarczająco dobrych systemów typów, aby zapewnić to w czasie kompilacji. Jeśli tak, awaria typu zostanie wykryta w czasie wykonywania lub być może zostaną wygenerowane błędne wyniki. Takie dziury są oczywiście niepożądane).
Kiedy definiuje się podklasy w programach obiektowych, zwykle dodaje się publicznie widoczne pola (lub metody). W większości języków programowania takie podklasy są uważane za podtypy nominalne . Pytanie brzmi, czy są to również podtypy strukturalne . Jeśli nie są, tzn. Język programowania pozwala zadeklarować nominalne podtypy, które nie są podtypami strukturalnymi, wówczas w języku programowania pojawią się dziury.
W prostych przypadkach dodawanie pól działa poprawnie. Typ nadklasy wymaga mniejszej liczby pól niż typ podklasy. Tak więc, jeśli podłączysz instancję podklasy, w której spodziewana jest instancja klasy sueprclass, program po prostu zignoruje podane dodatkowe pola i nic nie pójdzie źle.
Jeśli jednak nadklasa lub podklasa ma metody, które pobierają argumenty tego samego typu co ona sama lub zwracają wyniki tego samego typu co ona sama, pojawiają się problemy. Zatem typ interfejsu podklasy nie jest podtypem strukturalnym tego podklasy . Powszechnie używane bezpieczne języki programowania, takie jak Java, nie pozwalają na takie podklasy. Tak, one ograniczać się języka w celu uzyskania bezpieczeństwa typu. Mówi się, że język programowania Eiffel poświęcił bezpieczeństwo typu, aby zamiast tego uzyskać elastyczność . Jeśli ktoś projektuje silny system typów zachowujący elastyczność, musi zrezygnować z zasady, że podklasy powodują powstanie podtypów. Stąd tytuł pracy „Dziedziczenie nie jest poddziałem”. Autorzy proponują inne pojęcie podtypu wyższego rzędu, które działa zamiast tego. Kim Bruce ma również ściśle powiązaną propozycję zwaną „dopasowywaniem”, która osiąga ten sam efekt. Zobacz tę prezentację . Pomocny jest także dokument przedstawiający stanowisko Andrew Blacka.
Społeczność semantyki prawdopodobnie ponosi winę za to, że w dużej mierze ignoruje problem. Tradycyjnie uważaliśmy to za praktyczne zagadnienie inżynieryjne typu systemu, które nie ma teoretycznego zainteresowania. Jeśli tak nie jest i rzeczywiście istnieje w tej dziedzinie trochę semantyki, mam nadzieję, że inni o tym wspomną.