• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Złamanie zasady Liskov-a C#

Object Storage Arubacloud
0 głosów
147 wizyt
pytanie zadane 25 sierpnia 2020 w C# przez Adrian1999 Nałogowiec (34,570 p.)

Cześć wszystkim mam pytanie, otóż przerabiam sobie książkę p.t "Wzorce projektowe w .NET" autora Dmitri Nesteruk-a
I napotkałem na taki problem na początku, gdy w temacie związanym z zasadą Liskov-a pokazuje nam autor jakiego kodu nie pisać, ten kod u mnie działa.
 

    public class Rectangle
    {
        public int Width { get; set; }
        public int Height { get; set; }

        public Rectangle() { }

        public Rectangle(int width, int height)
        {
            Width = width;
            Height = height;
        }

        public int Area => Width * Height;
    }
 public class Square : Rectangle
    {
        public Square(int side)
        {
            Width = Height = side;
        }

        public new int Width
        {
            set => base.Width = base.Height = value;
        }

        public new int Height
        {
            set => base.Width = base.Height = value;
        }
        
    }

Z tego co rozumiem, aplikacja powinna przy każdym przypisaniu do zmiennej "Height" zmieniać również wartość zmiennej "Width", tutaj jest kod wywołujący 

        public static void UseIt(Rectangle r)
        {
            r.Height = 10;
            Console.WriteLine($"Oczekiwane pole powierzchni {10*r.Width}, uzyskano {r.Area}");
        }

I mam taki problem, w sumie brak zrozumienia, czemu przy zmianie wartości zmiennej obiektu nie zmienia się wartość szerokośći. Szerokość jest ciągle stała, bez względu na zmianę wysokości. Dzięki z góry

1 odpowiedź

0 głosów
odpowiedź 25 sierpnia 2020 przez Wiciorny Ekspert (270,770 p.)

być możę dlatego, żę w wyżej wymienionym kodzie zmieniana jest tylko wysokość?



Liskov-a pokazuje nam autor jakiego kodu nie pisać, ten kod u mnie działa.

Wzorce nie mówią o tym, że coś "bez ich zastosowania nie działa", otóż działać może.. wzorce to tylko pewne praktyki/zasady tego jak się coś powinno pisać - według ustalonej reguły, żeby było lepsze jakościowo,  lepsze w zrozumieniu, w dalszym rozszerzaniu czy też użyciu... 
 

komentarz 25 sierpnia 2020 przez Adrian1999 Nałogowiec (34,570 p.)
Z tego co zauważyłem, problem jest w linijce 30 w klasie square. Przy zmianie wysokości powinna zmieniać się również szerokość, co się nie dzieje. Błąd polega z tego co zauważyłem na tym że właśnie nie zmienia się szerokość
komentarz 25 sierpnia 2020 przez Wiciorny Ekspert (270,770 p.)
Nie rozwinąłem ... gapa ze mnie no ale nadal korzystamy z obiektu Rectangle , a nie obiektu Square który rozszerza Rectangle co jako tako znaczenia nie ma kiedy do funkcji  argumenetem jest Rectange
komentarz 25 sierpnia 2020 przez Adrian1999 Nałogowiec (34,570 p.)

Square nie rozszerza Rectangle, Square dziedziczy po rectangle, to różnica mi się wydaje. W ogóle znalazłem wersję tej książki w internecie, sam możesz prześledzić sobie błąd który napotkałem. https://dl.ebooksworld.ir/motoman/Apress.Design.Patterns.in.NET.www.EBooksWorld.ir.pdf (Strona 15)
Pamiętajmy  też że w obiekt square, w swojej definicji odwołuje się do swojego rodzica poprzez słowo kluczowe "base"

komentarz 25 sierpnia 2020 przez Wiciorny Ekspert (270,770 p.)

Dziedziczenie – lub inaczej rozszerzanie – zostało stworzone w celu wyodrębniania cech wspólnych obiektów.

tak ale jeśli dziecko dziedziczy cos po ojcu ale ma blizne której ojciec nie ma to 
 

public static void UseIt(Rectangle r)

siłą rzeczy Rectange r - jako rodzic nie moze miec wiedzy o tej bliźnie z poziomu takiej funkcji  , natomiast jeśli posłane byłoby Square- to jako dziecko które dziedziczy wszystko po Ojcu, wie o nim wszystko i ma wszystkie jego cechy 
static - jeszcze to nie jest związana metoda z obiektem ale z sama klasa jak sie nie myle 

Podobne pytania

0 głosów
1 odpowiedź 155 wizyt
pytanie zadane 10 czerwca 2020 w PHP przez XiverKi Bywalec (2,050 p.)
0 głosów
3 odpowiedzi 380 wizyt
pytanie zadane 22 października 2019 w PHP przez Artek Stary wyjadacz (11,800 p.)
0 głosów
0 odpowiedzi 201 wizyt

92,626 zapytań

141,486 odpowiedzi

319,844 komentarzy

62,009 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...