Próbując wyjaśnić pojęcie dziedziczenia w OOP, częstym przykładem jest często przykład ssaków. IMHO, to naprawdę zły przykład, ponieważ doprowadzi początkujących do niewłaściwego korzystania z tej koncepcji. Co więcej, nie jest to powszechny projekt, z którym będą mieli do czynienia w codziennej pracy projektowej.
Więc jaki będzie ładny, prosty i konkretny problem, który zostanie rozwiązany za pomocą Dziedziczenia?
design-patterns
object-oriented
inheritance
Pierre Watelet
źródło
źródło
Odpowiedzi:
Nie ma nic złego w czysto akademickim przykładzie, takim jak ssaki. Podoba mi się również przykład w kształcie prostokąta / kwadratu, ponieważ pokazuje, dlaczego taksonomie w świecie rzeczywistym nie zawsze bezpośrednio przekładają się na oczekiwane relacje dziedziczenia.
Moim zdaniem najbardziej kanonicznym przykładem każdego dnia jest zestaw narzędzi GUI. Jest to coś, z czego wszyscy korzystali, ale początkujący może nie rozumieli, jak działają pod maską. Możesz porozmawiać o tym, jakie zachowania są wspólne dla wszystkich kontenerów, wszystkich widżetów, zdarzeń itp. Bez konieczności szczegółowej wiedzy na temat dowolnej implementacji.
źródło
Moim prawdziwym przykładem jest model domeny prostej aplikacji HR. Mówię, że możemy stworzyć klasę podstawową o nazwie Pracownik , ponieważ oczywiście menedżerowie też są pracownikami.
Następnie wyjaśniam, że programiści to pracownicy , testerzy to pracownicy , kierownicy projektów to pracownicy . W ten sposób wszyscy mogą dziedziczyć po klasie pracowników.
źródło
Employee
może byćabstract
.Developer
i aTester
. Inną podobną sytuacją jest baza danych kontaktów, w której maszCustomer
iSupplier
, ale jak każdy, kto stworzył taki system, powie ci, zawsze istnieje przypadek, w którym jedno iCompany
drugie. Dlatego większość z tych przykładów prowadzi cię w złym kierunku.Hermetyzuj to, co się różni ... pokaż im wzorzec metody szablonu , demonstruje on przydatność dziedziczenia poprzez umieszczenie wspólnego zachowania w klasie bazowej i hermetyzowanie różnych zachowań w podklasach.
UI controls
iStreams
są również bardzo dobrym przykładem przydatności dziedziczenia.źródło
Zapamiętaj
Każde wystąpienie obiektu jest konkretnym przykładem przydatności dziedziczenia!
Jeśli masz na myśli konkretnie klasę dziedziczenie , teraz znajdujesz się w świecie taksonomii, które różnią się drastycznie od celów systemu, który ich używa. Przykład zwierząt / ssaków wykorzystuje wspólną i miejmy nadzieję znaną taksonomię z biologii, ale jest (jak wspomniałeś) prawie bezużyteczny w przypadku większości problemów programistycznych.
Spróbuj więc czegoś uniwersalnego: pojęcia programu. Każdy program uruchamia się, uruchamia i kończy. Każdy program ma nazwę i opcjonalne parametry wiersza polecenia. Podstawowa klasa programu byłaby więc bardzo przydatna, aby rozpocząć wykonywanie, przechwytywać i przetwarzać argumenty wiersza poleceń, uruchamiać główną logikę i wdzięcznie zamykać.
Dlatego tak wiele obiektowych języków programowania zapewnia klasę Program lub coś, co zachowuje się dokładnie jak klasa Program.
źródło
class Programm { public static void main(String[] args) { system.out.println('hello world'); }}
to minimalny program Java. Kiedy go nazywam, nie ma wystąpienia programu. Program nie dziedziczy po niczym. Kiedy uruchamiam 3 procesy (tak jak robisz to z crhome), mogą istnieć 3 programy, ale w ich poszczególnych obszarach pamięci wciąż jest tylko jeden program. Imho, singleton oznacza „Tylko jedną instancję na proces”, a nie na maszynę. Jeśli tak, to nie byłoby możliwe tworzenie singletonów, nic nie stoi na przeszkodzie, aby uruchomić kod dwukrotnie.Pracuję z aparatami w pracy. Mamy urządzenia, które łączą się z różnymi modelami, więc mamy abstrakcyjną „klasę kamery”, a każdy model dziedziczy z tej klasy, aby obsługiwać określone funkcje tej kamery. To przykład z prawdziwego świata i nietrudny do zrozumienia.
źródło
Camera
i aPhone
(jak wszyscy teraz robimy w naszych kieszeniach). Z jakiej klasy podstawowej powinien dziedziczyć? A może nie powinien po prostu implementować zarówno interfejsu, jakICamera
iIPhone
interfejsów? (ha ha)Przykład pierwiastków chemicznych
Oto kolejny przykład, który wyskoczył mi z mózgu:
źródło
isotope
nie jest szczególnym przypadkiemElemenet
. Wolałbym miećElement
własność naIsotope
.Przykłady ze świata rzeczywistego prawie zawsze źle to rozumieją, ponieważ podają przykłady, w których zawsze istnieje możliwość, że coś jest jednocześnie,
TypeA
aTypeB
jedna hierarchia dziedziczenia wielu języków nie pozwala na to.Im więcej programuję, tym bardziej uciekam od dziedziczenia.
Nawet słowo „dziedziczenie” jest tu używane niewłaściwie. Na przykład dziedziczysz około 50% cech ojca i 50% cech matki. Naprawdę twoje DNA składa się z połowy DNA twojego ojca i połowy DNA twojej matki. To dlatego, że biologia w rzeczywistości preferuje kompozycję nad dziedziczeniem , a ty też powinieneś.
Po prostu implementacja interfejsów, a nawet lepiej, „pisanie kaczych znaków” oraz wstrzykiwanie zależności, jest o wiele lepszą rzeczą, aby uczyć ludzi, którzy są nowicjuszami w programowaniu obiektowym.
źródło
Po prostu pokażę im przykład z życia. Na przykład, w większości frameworków interfejsu użytkownika wywodzisz się z pewnego rodzaju klasy „Dialog”, „Window” lub „Control”, aby stworzyć własną.
źródło
Dobrym przykładem jest funkcja porównania w sortowaniu:
Jedynym problemem jest to, że początkujący zbyt często uważają, że wydajność jest ważniejsza niż dobry kod ...
źródło
Moim prawdziwym przykładem jest pojazd:
Ten przykład może być tak szczegółowy, jak tylko chcesz, a do pojazdów dołączone są różnego rodzaju właściwości wyjaśniające użycie dowolnych modyfikatorów, których możesz chcieć nauczyć.
źródło
Ten przykład, który nie jest ssakiem, ptakiem i ptakiem, może nie pomóc:
Następnie
UWAGA: Po prostu nie zdradzaj tajemnicy: Osoba rozszerza Ssak.
źródło
A może hierarchia wyrażeń algebraicznych. Jest dobry, ponieważ obejmuje zarówno dziedziczenie, jak i kompozycję:
Z wyjątkiem wyrażenia głównego Constant wszystkie pozostałe wyrażenia są zarówno Wyrażeniami, jak i zawierają jedno lub więcej wyrażeń.
źródło
Wykorzystam ptaki jako przykład
jak kurczak, kaczka, orzeł
Wyjaśnię, że oba mają pazury, dziobaki i skrzydła, ale ich atrybuty są różne.
Kurczaki nie potrafią latać, nie potrafią pływać, mogą jeść robaków, mogą jeść ziarna
Kaczki nie mogą latać, mogą pływać, mogą jeść ziarna, nie mogą jeść robaków
Orzeł potrafi latać, nie umie pływać, może jeść robaki, nie może jeść zbóż
źródło
Typowy klon-szyna zawiera wiele praktycznych przykładów : masz (abstrakcyjną) klasę modelu bazowego, która zawiera wszystkie operacje na danych i masz klasę bazowego kontrolera, która obejmuje całą komunikację HTTP.
źródło