nie tyle co rzutowanie do góry, tylko to wywołanie metody Draw bez słówka kluczowego 'override' nie było już polimorficzne. Także w pętli jeżeli iterujemy po obiektach typu Shape, a metoda Draw nie ma nadpisania w klasie dziedziczącej tym właśnie słówkiem override, to po prostu wywołała się ta metoda Draw z klasy Shape
Zależy od przypadku, jeżeli chcemy wymusić napisanie implementacji w klasach pochodnych to wtedy użyjemy metody abstrakcyjne. A jeżeli tylko niektóre klasy pochodne powinny mieć swoją napisaną impregnację to wtedy użyjemy metody wirtualnej
Hehe, okazało się, że używałem polimorfizmu nawet o tym nie wiedząc :D Nie takie to straszne jak się wydawało :D
Na końcu pokazało się "Drawing shape" dlatego, że w pętli zaszło rzutowanie obiektu do góry?
nie tyle co rzutowanie do góry, tylko to wywołanie metody Draw bez słówka kluczowego 'override' nie było już polimorficzne.
Także w pętli jeżeli iterujemy po obiektach typu Shape, a metoda Draw nie ma nadpisania w klasie dziedziczącej tym właśnie słówkiem override, to po prostu wywołała się ta metoda Draw z klasy Shape
@@FullstackDeveloperPL Ok o to mi chodziło, dzięki!
Uważasz, że lepiej jest jak wszystkie metody są domyślnie wirtualne (jak w Javie), czy jak trzeba je explicite zadeklarować jako wirtualne (jak w C#)?
lepiej jawnie(explicit) jako wirtualne ;)
@@FullstackDeveloperPL Czemu?
@@plrc4593 a jak chciałbyś ustawić że domyślnie wszystkie metody są wirtualne?
@@FullstackDeveloperPL Tak podobno jest w Javie :P
@@plrc4593 a to w c# jeżeli nie dasz słowa kluczewego virtual to nie był by polimorfizm tylko przesłanianie metod
To kiedy lepiej wykonać metodę wirtualną, a kiedy metodę abstrakcyjną?
Zależy od przypadku, jeżeli chcemy wymusić napisanie implementacji w klasach pochodnych to wtedy użyjemy metody abstrakcyjne. A jeżeli tylko niektóre klasy pochodne powinny mieć swoją napisaną impregnację to wtedy użyjemy metody wirtualnej