{"id":4262,"date":"2025-08-31T17:47:28","date_gmt":"2025-08-31T15:47:28","guid":{"rendered":"https:\/\/natalia-kaczynska.profesjonalnyprogramista.pl\/?page_id=4262"},"modified":"2026-04-09T12:51:22","modified_gmt":"2026-04-09T10:51:22","slug":"liskov-substitution-principle","status":"publish","type":"page","link":"https:\/\/natalia-kaczynska.profesjonalnyprogramista.pl\/en\/liskov-substitution-principle\/","title":{"rendered":"Liskov Substitution Principle"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"4262\" class=\"elementor elementor-4262\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4170469c e-con-full e-flex e-con e-parent\" data-id=\"4170469c\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-637eb658 e-flex e-con-boxed e-con e-child\" data-id=\"637eb658\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2dd99424 elementor-icon-list--layout-inline elementor-mobile-align-center elementor-align-left elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"2dd99424\" data-element_type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items elementor-inline-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<i aria-hidden=\"true\" class=\"icon icon-envelope1\"><\/i>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">natalia.kaczynska.programista@gmail.com<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-63e2ce4 elementor-widget elementor-widget-shortcode\" data-id=\"63e2ce4\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><div id=\"mega-menu-wrap-secondary_menu\" class=\"mega-menu-wrap\"><div class=\"mega-menu-toggle\"><div class=\"mega-toggle-blocks-left\"><\/div><div class=\"mega-toggle-blocks-center\"><\/div><div class=\"mega-toggle-blocks-right\"><div class='mega-toggle-block mega-menu-toggle-animated-block mega-toggle-block-0' id='mega-toggle-block-0'><button aria-label=\"Show\/hide menu\" class=\"mega-toggle-animated mega-toggle-animated-slider\" type=\"button\" aria-haspopup=\"true\" aria-expanded=\"false\" aria-controls=\"mega-menu-secondary_menu\">\n                  <span class=\"mega-toggle-animated-box\">\n                    <span class=\"mega-toggle-animated-inner\"><\/span>\n                  <\/span>\n                <\/button><\/div><\/div><\/div><ul id=\"mega-menu-secondary_menu\" class=\"mega-menu max-mega-menu mega-menu-horizontal mega-no-js\" data-event=\"hover\" data-effect=\"fade_up\" data-effect-speed=\"400\" data-effect-mobile=\"slide\" data-effect-speed-mobile=\"400\" data-mobile-force-width=\"false\" data-second-click=\"go\" data-document-click=\"collapse\" data-vertical-behaviour=\"standard\" data-breakpoint=\"768\" data-unbind=\"true\" data-mobile-state=\"collapse_all\" data-mobile-direction=\"vertical\" data-hover-intent-timeout=\"300\" data-hover-intent-interval=\"100\"><li class=\"mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-align-bottom-left mega-menu-flyout mega-menu-item-4547\" id=\"mega-menu-item-4547\"><a class=\"mega-menu-link\" href=\"https:\/\/natalia-kaczynska.profesjonalnyprogramista.pl\/en\/porftolio-v2\/\">Portfolio<\/a><\/li><li class=\"mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-home mega-align-bottom-left mega-menu-flyout mega-menu-item-3974\" id=\"mega-menu-item-3974\"><a class=\"mega-menu-link\" href=\"https:\/\/natalia-kaczynska.profesjonalnyprogramista.pl\/en\/\">Homepage<\/a><\/li><li class=\"mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-align-bottom-left mega-menu-flyout mega-menu-item-3975\" id=\"mega-menu-item-3975\"><a class=\"mega-menu-link\" href=\"https:\/\/natalia-kaczynska.profesjonalnyprogramista.pl\/en\/about\/\">About me<\/a><\/li><li class=\"mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-has-children mega-menu-megamenu mega-menu-grid mega-align-bottom-left mega-menu-grid mega-menu-item-4304\" id=\"mega-menu-item-4304\"><a class=\"mega-menu-link\" href=\"#\" aria-expanded=\"false\" aria-controls=\"mega-sub-menu-4304\">Articles<span class=\"mega-indicator\" aria-hidden=\"true\"><\/span><\/a>\n<ul class=\"mega-sub-menu\" role='presentation' id='mega-sub-menu-4304'>\n<li class=\"mega-menu-row\" id=\"mega-menu-4304-0\">\n\t<ul class=\"mega-sub-menu\" style='--columns:2' role='presentation'>\n<li class=\"mega-menu-column mega-menu-columns-3-of-2\" style=\"--columns:2; --span:3\" id=\"mega-menu-4304-0-0\">\n\t\t<ul class=\"mega-sub-menu\">\n<li class=\"mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-has-children mega-disable-link mega-menu-item-4306\" id=\"mega-menu-item-4306\"><a class=\"mega-menu-link\" tabindex=\"0\">Design patterns<span class=\"mega-indicator\" aria-hidden=\"true\"><\/span><\/a>\n\t\t\t<ul class=\"mega-sub-menu\" id='mega-sub-menu-4306'>\n<li class=\"mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-4314\" id=\"mega-menu-item-4314\"><a class=\"mega-menu-link\" href=\"https:\/\/natalia-kaczynska.profesjonalnyprogramista.pl\/en\/elementor-4099\/\">Strategy<\/a><\/li><li class=\"mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-4313\" id=\"mega-menu-item-4313\"><a class=\"mega-menu-link\" href=\"https:\/\/natalia-kaczynska.profesjonalnyprogramista.pl\/en\/budowniczy\/\">Builder<\/a><\/li><li class=\"mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-4312\" id=\"mega-menu-item-4312\"><a class=\"mega-menu-link\" href=\"https:\/\/natalia-kaczynska.profesjonalnyprogramista.pl\/en\/fabryka\/\">Factory<\/a><\/li>\t\t\t<\/ul>\n<\/li><li class=\"mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-has-children mega-disable-link mega-menu-item-4305\" id=\"mega-menu-item-4305\"><a class=\"mega-menu-link\" tabindex=\"0\">SOLID<span class=\"mega-indicator\" aria-hidden=\"true\"><\/span><\/a>\n\t\t\t<ul class=\"mega-sub-menu\" id='mega-sub-menu-4305'>\n<li class=\"mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-4311\" id=\"mega-menu-item-4311\"><a class=\"mega-menu-link\" href=\"https:\/\/natalia-kaczynska.profesjonalnyprogramista.pl\/en\/elementor-4232\/\">Single responsibility<\/a><\/li><li class=\"mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-4310\" id=\"mega-menu-item-4310\"><a class=\"mega-menu-link\" href=\"https:\/\/natalia-kaczynska.profesjonalnyprogramista.pl\/en\/elementor-4246\/\">Open-Closed Principle<\/a><\/li><li class=\"mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-4309\" id=\"mega-menu-item-4309\"><a class=\"mega-menu-link\" href=\"https:\/\/natalia-kaczynska.profesjonalnyprogramista.pl\/en\/liskov-substitution-principle\/\">Liskov Substitution Principle<\/a><\/li><li class=\"mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-4308\" id=\"mega-menu-item-4308\"><a class=\"mega-menu-link\" href=\"https:\/\/natalia-kaczynska.profesjonalnyprogramista.pl\/en\/elementor-4278\/\">Interface Segregation Principle<\/a><\/li><li class=\"mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-4307\" id=\"mega-menu-item-4307\"><a class=\"mega-menu-link\" href=\"https:\/\/natalia-kaczynska.profesjonalnyprogramista.pl\/en\/elementor-4292\/\">Dependency Inversion Principle<\/a><\/li>\t\t\t<\/ul>\n<\/li>\t\t<\/ul>\n<\/li>\t<\/ul>\n<\/li><\/ul>\n<\/li><li class=\"mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-align-bottom-left mega-menu-flyout mega-menu-item-3976\" id=\"mega-menu-item-3976\"><a class=\"mega-menu-link\" href=\"https:\/\/natalia-kaczynska.profesjonalnyprogramista.pl\/en\/contact\/\">Contact<\/a><\/li><\/ul><\/div><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e8dc490 e-flex e-con-boxed e-con e-parent\" data-id=\"e8dc490\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4a3659e elementor-widget elementor-widget-heading\" data-id=\"4a3659e\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Liskov Substitution Principle (zasada podstawienia Liskov)<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0291675 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"0291675\" data-element_type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f40ae7a elementor-widget elementor-widget-text-editor\" data-id=\"f40ae7a\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"251\" data-end=\"756\">Zasada podstawienia Liskov (Liskov Substitution Principle) to\u00a0 jedno z najwa\u017cniejszych za\u0142o\u017ce\u0144 dobrego programowania obiektowego. Jej g\u0142\u00f3wnym celem jest zapewnienie, aby <strong>klasy pochodne mog\u0142y bez problemu zast\u0119powa\u0107 swoje klasy bazowe<\/strong>, nie zmieniaj\u0105c poprawno\u015bci dzia\u0142ania programu. W praktyce oznacza to, \u017ce je\u015bli korzystamy z klasy nadrz\u0119dnej, powinni\u015bmy m\u00f3c podstawi\u0107 w jej miejsce dowoln\u0105 klas\u0119 dziedzicz\u0105c\u0105 \u2013 i nasz kod nadal b\u0119dzie dzia\u0142a\u0142 zgodnie z oczekiwaniami.<\/p><p data-start=\"758\" data-end=\"1104\">Brzmi abstrakcyjnie, ale LSP ma bardzo konkretne znaczenie dla jako\u015bci kodu: pomaga utrzyma\u0107 sp\u00f3jno\u015b\u0107, unika\u0107 b\u0142\u0119d\u00f3w logicznych i tworzy\u0107 systemy, kt\u00f3re s\u0105 bardziej przewidywalne oraz \u0142atwiejsze w rozbudowie.<\/p><p data-start=\"758\" data-end=\"1104\">Teraz przedstawi\u0119 przyk\u0142ad kodu, kt\u00f3ry <strong>\u0142amie zasad\u0119 podstawienia Liskov:<\/strong><\/p><p data-start=\"758\" data-end=\"1104\">Mamy tak\u0105 klas\u0119 Bird:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9cf6551 elementor-widget elementor-widget-wp-widget-custom_html\" data-id=\"9cf6551\" data-element_type=\"widget\" data-widget_type=\"wp-widget-custom_html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"textwidget custom-html-widget\"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\npublic class Bird {\r\n    public void fly() {\r\n        System.out.println(&quot;The bird files!&quot;);\r\n    }\r\n}\r\n\r\n<\/pre><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-102f195 e-flex e-con-boxed e-con e-parent\" data-id=\"102f195\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b2c3706 elementor-widget elementor-widget-text-editor\" data-id=\"b2c3706\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Nast\u0119pnie &#8211; tworzymy klas\u0119 Penguin, kt\u00f3ra dziedziczy po klasie Bird<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a59d8d5 elementor-widget elementor-widget-wp-widget-custom_html\" data-id=\"a59d8d5\" data-element_type=\"widget\" data-widget_type=\"wp-widget-custom_html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"textwidget custom-html-widget\"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nclass Penguin extends Bird {\r\n    @Override\r\n    public void fly() {\r\n        throw new UnsupportedOperationException(&quot;Penguin can&#039;t fly!&quot;);\r\n    }\r\n}\r\n\r\n<\/pre><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-2b961bf e-flex e-con-boxed e-con e-parent\" data-id=\"2b961bf\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-94c8e60 elementor-widget elementor-widget-text-editor\" data-id=\"94c8e60\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Przy wyo\u0142ywaniu funkcji dla obiektu Penguin pojawi si\u0119 b\u0142\u0105d, kt\u00f3ry zdefiniowa\u0142am w powy\u017cszej klasie. Oczywi\u015bcie pingwin nie potrafi lata\u0107, wi\u0119c takie dziedziczenie jest bez sensu i psuje logik\u0119 programu.<\/p><p>Poprawiona wersja przyk\u0142adu zgodna z zasad\u0105 podstawienia Liskov.<\/p><p>Zmieniamy klas\u0119 Bird na abstrakcyjn\u0105 i definiujemy przyk\u0142adow\u0105 metod\u0119 wsp\u00f3ln\u0105 dla r\u00f3\u017cnych ptak\u00f3w (tutaj eat()):<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9cd7de4 elementor-widget elementor-widget-wp-widget-custom_html\" data-id=\"9cd7de4\" data-element_type=\"widget\" data-widget_type=\"wp-widget-custom_html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"textwidget custom-html-widget\"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nabstract class Bird {\r\n    abstract void eat();\r\n}\r\n\r\n<\/pre><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-ed3a4b8 e-flex e-con-boxed e-con e-parent\" data-id=\"ed3a4b8\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-319bcaf elementor-widget elementor-widget-text-editor\" data-id=\"319bcaf\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Nast\u0119pnie tworz\u0119 interfejs CanFly<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c5316b0 elementor-widget elementor-widget-wp-widget-custom_html\" data-id=\"c5316b0\" data-element_type=\"widget\" data-widget_type=\"wp-widget-custom_html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"textwidget custom-html-widget\"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\ninterface CanFly {\r\n    void fly();\r\n}\r\n<\/pre><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-5d7fee0 e-flex e-con-boxed e-con e-parent\" data-id=\"5d7fee0\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-da0b16e elementor-widget elementor-widget-wp-widget-custom_html\" data-id=\"da0b16e\" data-element_type=\"widget\" data-widget_type=\"wp-widget-custom_html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"textwidget custom-html-widget\"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nclass FlyingBird extends Bird {\r\n    void fly() {\r\n        System.out.println(&quot;The bird flies!&quot;);\r\n    }\r\n}\r\n<\/pre><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-1849bb0 e-flex e-con-boxed e-con e-parent\" data-id=\"1849bb0\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0526c11 elementor-widget elementor-widget-wp-widget-custom_html\" data-id=\"0526c11\" data-element_type=\"widget\" data-widget_type=\"wp-widget-custom_html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"textwidget custom-html-widget\"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nclass Sparrow extends Bird implements CanFly{\r\n    @Override\r\n    void eat() {\r\n        System.out.println(&quot;Sparrow eats grains and insects.&quot;);\r\n    }\r\n\r\n    @Override\r\n    public void fly() {\r\n        System.out.println(&quot;Sparrow can flies.&quot;);\r\n    }\r\n}\r\n<\/pre><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-ae7b9bf e-flex e-con-boxed e-con e-parent\" data-id=\"ae7b9bf\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9712e88 elementor-widget elementor-widget-wp-widget-custom_html\" data-id=\"9712e88\" data-element_type=\"widget\" data-widget_type=\"wp-widget-custom_html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"textwidget custom-html-widget\"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nclass Penguin extends Bird {\r\n    @Override\r\n    void eat(){\r\n        System.out.println(&quot;Penguin eats fish.&quot;);\r\n    }\r\n}\r\n\r\n<\/pre><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-463e819 e-flex e-con-boxed e-con e-parent\" data-id=\"463e819\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-edf2539 elementor-widget elementor-widget-wp-widget-custom_html\" data-id=\"edf2539\" data-element_type=\"widget\" data-widget_type=\"wp-widget-custom_html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"textwidget custom-html-widget\"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\npublic class Demo {\r\n    public static void main(String&#x5B;] args){\r\n        Bird sparrow = new Sparrow();\r\n        Bird penguin = new Penguin();\r\n\r\n        sparrow.eat();\r\n        penguin.eat();\r\n\r\n        CanFly flyingSparrow = (CanFly) sparrow;\r\n        flyingSparrow.fly();\r\n    }\r\n}\r\n<\/pre><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-045b9b7 e-flex e-con-boxed e-con e-parent\" data-id=\"045b9b7\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-306c7df elementor-widget elementor-widget-text-editor\" data-id=\"306c7df\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"175\" data-end=\"505\">W tym przyk\u0142adzie pokaza\u0142am, jak \u0142atwo mo\u017cna z\u0142ama\u0107 zasad\u0119 podstawienia Liskov, gdy klasa potomna nie spe\u0142nia kontraktu klasy bazowej. W pierwotnej wersji <code data-start=\"332\" data-end=\"341\">Penguin<\/code> dziedziczy\u0142 po <code data-start=\"357\" data-end=\"363\">Bird<\/code> z metod\u0105 <code data-start=\"373\" data-end=\"380\">fly()<\/code>, co prowadzi\u0142o do b\u0142\u0119d\u00f3w w czasie dzia\u0142ania programu \u2013 obiekt pingwina nie m\u00f3g\u0142 zast\u0105pi\u0107 og\u00f3lnego ptaka bez psucia logiki.<\/p><p data-start=\"507\" data-end=\"714\">Rozwi\u0105zaniem by\u0142o wydzielenie <strong data-start=\"537\" data-end=\"577\">wsp\u00f3lnego kontraktu w klasie bazowej<\/strong> (<code data-start=\"579\" data-end=\"585\">Bird<\/code>) i oddzielenie specyficznych zachowa\u0144, takich jak latanie, do osobnego interfejsu (<code data-start=\"669\" data-end=\"677\">CanFly<\/code>). Dzi\u0119ki temu ka\u017cda klasa potomna:<\/p><ul data-start=\"716\" data-end=\"886\"><li data-start=\"716\" data-end=\"761\"><p data-start=\"718\" data-end=\"761\">spe\u0142nia kontrakt klasy bazowej (<code data-start=\"750\" data-end=\"757\">eat()<\/code>),<\/p><\/li><li data-start=\"762\" data-end=\"809\"><p data-start=\"764\" data-end=\"809\">zachowuje si\u0119 przewidywalnie i bezpiecznie,<\/p><\/li><li data-start=\"810\" data-end=\"886\"><p data-start=\"812\" data-end=\"886\">nie \u201ewymusza\u201d implementacji metod, kt\u00f3re nie maj\u0105 sensu dla danego typu.<\/p><\/li><\/ul><p data-start=\"888\" data-end=\"1198\">Zasada Liskov Substitution Principle uczy nas projektowa\u0107 klasy w taki spos\u00f3b, aby mo\u017cna je by\u0142o bezpiecznie podmienia\u0107 w programie. Dzi\u0119ki temu kod staje si\u0119 bardziej <strong data-start=\"1056\" data-end=\"1120\">elastyczny, \u0142atwiejszy do rozbudowy i mniej podatny na b\u0142\u0119dy<\/strong>, a ka\u017cda nowa klasa w hierarchii nie wprowadza nieprzewidzianych problem\u00f3w.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\n    <div class=\"xs_social_share_widget xs_share_url after_content \t\tmain_content  wslu-style-1 wslu-share-box-shaped wslu-fill-colored wslu-none wslu-share-horizontal wslu-theme-font-no wslu-main_content\">\n\n\t\t\n        <ul>\n\t\t\t        <\/ul>\n    <\/div>","protected":false},"excerpt":{"rendered":"<p>natalia.kaczynska.programista@gmail.com Liskov Substitution Principle (zasada podstawienia Liskov) Zasada podstawienia Liskov (Liskov Substitution Principle) to\u00a0 jedno z najwa\u017cniejszych za\u0142o\u017ce\u0144 dobrego programowania [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"postBodyCss":"","postBodyMargin":[],"postBodyPadding":[],"postBodyBackground":{"backgroundType":"classic","gradient":""},"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-4262","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/natalia-kaczynska.profesjonalnyprogramista.pl\/en\/wp-json\/wp\/v2\/pages\/4262","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/natalia-kaczynska.profesjonalnyprogramista.pl\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/natalia-kaczynska.profesjonalnyprogramista.pl\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/natalia-kaczynska.profesjonalnyprogramista.pl\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/natalia-kaczynska.profesjonalnyprogramista.pl\/en\/wp-json\/wp\/v2\/comments?post=4262"}],"version-history":[{"count":10,"href":"https:\/\/natalia-kaczynska.profesjonalnyprogramista.pl\/en\/wp-json\/wp\/v2\/pages\/4262\/revisions"}],"predecessor-version":[{"id":4872,"href":"https:\/\/natalia-kaczynska.profesjonalnyprogramista.pl\/en\/wp-json\/wp\/v2\/pages\/4262\/revisions\/4872"}],"wp:attachment":[{"href":"https:\/\/natalia-kaczynska.profesjonalnyprogramista.pl\/en\/wp-json\/wp\/v2\/media?parent=4262"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}