Nic to však nemění na tom, že se mi nelíbí možnost, pouze díky shodě rozhraní či podobnosti hodnoty, zaměnit dva naprosto odlišné objekty (což v C++ už tak jednoduché není. Tedy pokud nejsou potomky jedné třídy, ale pak je už nepovažuji za naprosto odlišné.... ). Tedy chci, aby se potopil potápěč a ... pošlu ke dnu celou letadlovou loď...
To se mi taky nelíbí. Na druhou stranu je to jednodušší, pružnější.
1.) ze ve staticky typovanem jazyku mi instance.potop nikdy nepotopi ponorku? japato, co kdyz jsem se upsal a potapim prave instanci ponorky? typechecker to prohlasi za ok, chyba je v semantice, stejne jako kdyz se upisu v dynamicky typovanem
Japato: protože je tam explicitně napsaný typ. Mám třeba nějakou funkci, která má na starosti ponor potápěče na určitém místě a té dám jako parametr potápěče:
void ponor(Potapec& p, double zem_sirka, double zem_delka) {
//...
p.ponor();
// ...
}
Taková funkce nemůže potopit ponorku, protože p nemůže být ponorka, může to být jenom potápěč. Nejde jí předat místo potápěče něco jiného, překladač by zahlásil chybu a program by nepřeložil. Pokud se program přeloží, je zaručeno, že funkce ponor() pracuje vždycky jen s potápěčem a nikdy s ničím jiným.