Pytanie dotyczące OOP, klas - gdzie umieścić metodę

Pytanie dotyczące OOP, klas - gdzie umieścić metodę
CI
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 11 lat
1

Piszę na zajęcia program do obsługi wypożyczalni. I mam mały problem. Gdzie umieścić metodę wypożycz() ? Wiadomo, że wypożyczyć może klient wypożyczalni, logiczne. Tylko nie wiem, co będzie poprawne (lub "bardziej poprawne"). Umieszczenie tej metody w klasie Klient (tak jak to zrobiłem, bo "Klient wypożycza") czy może jednak umieszczenie jej w klasie Zbiór, która jest klasą bazową dla klas Książka, Film, etc. (bo "Książka jest wypożyczana") ? Bo tak zacząłem nad tym myśleć i mam wątpliwości.


ZJ
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 12 lat
1

Zależy to od logiki aplikacji, ja bym się jednak zastanawiał nad tym, czy książka nie jest wypożyczana przez osobę z biblioteki, czyli tam dać metodę biblioteka.wypożycz(książka{czy jej klasa bazowa}, osoba). Zbiór jest trochę niefortunną nazwą dla klasy bazowej, bardziej bym się po takiej nazwie spodziewał kolekcji, ale teraz nie mogę wpaść na jakąś dobrą (może ObiektWypożyczany, lub Materiał, Dokument).

somekind
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:dzień
  • Lokalizacja:Wrocław
1

Ja bym się zastanowił jaki jest sens istnienia klas Książka i Film posiadających jakąś klasę bazową. Gdy do oferty dodamy majtki, długopisy i siodła, to będziemy za każdym razem tworzyć nową klasę?

CI
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 11 lat
0

Wiem, że to trochę "na siłę", ale ma być program, który będzie miał przynajmniej dwie klasy bazowe i pochodne.


somekind
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:dzień
  • Lokalizacja:Wrocław
1

To ja bym zrobił tak, żeby Książka i Film dziedziczyły z Produkt (nietrafna nazwa, ale chwilowo nie mam pomysłu), a klasa Wypożyczalnia miała kolekcję obiektów typu Produkt i metodę Wypożycz.

ZJ
Na Wiki ogólnym określeniem jest "jednostka biblioteczna".
CI
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 11 lat
0

To ja bym zrobił tak, żeby Książka i Film dziedziczyły z Produkt (nietrafna nazwa, ale chwilowo nie mam pomysłu), a klasa Wypożyczalnia miała kolekcję obiektów typu Produkt i metodę Wypożycz.

Czyli klasą abstrakcyjną byłaby Wypożyczalnia, z której dziedziczy Produkt (albo Kolekcja ?). Z klasy Wypożyczalnia dziedziczy też Człowiek, który jest klasą bazową dla Klient i Pracownik (Klient może wypożyczać, etc., a Pracownik ma określoną pensję, etc.). Nie wiem, czy to dobre rozumowanie.

Wcześniej z Kolekcji dziedziczyły Książka, Płyta Audio oraz Film, bo miały różne pola, tzn. Książka ma liczbę stron, okładkę (miękka/twarda), ISBN oraz wydawnictwo. Z kolei płyta z muzyką będzie mieć jakiś nośnik (CD, 2CD, a może winyl), liczbę utworów, wytwórnię i czas trwania. Film będzie miał reżysera, produkcję (kraj/-e), itd. Tak to "rozumiałem".


byku_guzio
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 7 lat
2

Nigdy bym nie wpadł, na to żeby Człowiek dziedziczył z Wypożyczalni o_O Z tego co kojarzę to człowiek nie jest szczególnym przypadkiem wypożyczalni, ale mogę się mylić :p


CI
Czyli żle ? E... Facet na zajęciach pokazywał przykład, gdzie Osoba dziedziczy z klasy Bank. On chyba rzeczywiście nie do końca rozumie o czym mówi (ostatnio mówił, że prostokąt jest szczególnym przypadkiem kwadratu :) ). Pozostaje samemu "walczyć" żeby się nauczyć.
byku_guzio
No zdecydowanie źle - dziedziczenie to relacja "is a"/"jest typu". Dziedziczenie to nie jest coś co stosuje się na każdym kroku, zdecydowanie częściej przydają się agregacje i kompozycje.
CI
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 11 lat
0

Czyli poprawniejsze będzie coś takiego ?

Klasa Kolekcja (albo ElementKolekcji ?), która jest bazowa dla Książki, Audio i Filmu. Klasa Człowiek, która jest bazowa dla Klienta i Pracownika.


edytowany 2x, ostatnio: cichociemny
somekind
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:dzień
  • Lokalizacja:Wrocław
1
cichociemny napisał(a):

Czyli klasą abstrakcyjną byłaby Wypożyczalnia, z której dziedziczy Produkt (albo Kolekcja ?). Z klasy Wypożyczalnia dziedziczy też Człowiek, który jest klasą bazową dla Klient i Pracownik (Klient może wypożyczać, etc., a Pracownik ma określoną pensję, etc.). Nie wiem, czy to dobre rozumowanie.

Wydawało mi się, że napisałem zrozumiale...

Kopiuj
abstract class JednostkaBiblioteczna // nazwa zasugerowana przez @Zjarek
{
    // cośtam
}

class Film : JednostkaBiblioteczna
{
    // cośtam
}

class Książka : JednostkaBiblioteczna
{
    // cośtam
}

class Klient
{
    // cośtam
}

class Wypożyczalnia
{
    // cośtam

    JednostkaBiblioteczna[] rzeczyDoWypożyczenia;  // wewnętrzna kolekcja wypożyczalni, która jest jakoś tam uzupełniana

    public void WypożyczCośCzłowiekowi(Klient ludź)
    {
    }
}
 
cichociemny napisał(a):

Wcześniej z Kolekcji dziedziczyły Książka, Płyta Audio oraz Film, bo miały różne pola, tzn. Książka ma liczbę stron, okładkę (miękka/twarda), ISBN oraz wydawnictwo. Z kolei płyta z muzyką będzie mieć jakiś nośnik (CD, 2CD, a może winyl), liczbę utworów, wytwórnię i czas trwania. Film będzie miał reżysera, produkcję (kraj/-e), itd. Tak to "rozumiałem".

Miej tylko świadomość, że to wszystko, to taki absurdalny akademicki przykład dziedziczenia. W normalnym programie byłaby klasa Produkt, która miałaby listę swoich Atrybutów, które z kolei zależałyby od typu produktu, ale nie tworzyłoby się nowych klas przy każdej zmianie asortymentu.

edytowany 1x, ostatnio: somekind
ZJ
public void WypożyczCośCzłowiekowi(Klient ludź){ ludź.dodajRzecz (losowyElement (rzeczyDoWypożyczenia));} ?
CI
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 11 lat
0

No, jakbym "normalnie" coś pisał, tzn. dla siebie czy dla kogoś, ale nie na uczelnię, to bym inaczej podszedł. Na uczelni wymagają czasem absurdów, więc trzeba jakoś to przeboleć, a chcę żeby chociaż trochę poprawności OOP tam było, stąd temat. Dzięki za pomoc.


Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.