• 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#

Aruba Cloud - Virtual Private Server VPS
0 głosów
214 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 (279,870 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 (279,870 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 (279,870 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ź 189 wizyt
pytanie zadane 10 czerwca 2020 w PHP przez XiverKi Bywalec (2,050 p.)
0 głosów
3 odpowiedzi 580 wizyt
pytanie zadane 22 października 2019 w PHP przez Artek Stary wyjadacz (11,800 p.)
0 głosów
0 odpowiedzi 244 wizyt

93,264 zapytań

142,260 odpowiedzi

322,234 komentarzy

62,582 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...