Problemy raczkującego - dziedziczenie klas

Odpowiedz Nowy wątek
2018-12-17 20:00
0

Cześć. Jestem w trakcie poznawania tajników programowania obiektowego w Javie.
Stworzyłem klasę "Person", która jest klasą nadrzędną. Do tego powstała klasa "Wear", aby tą postać ubrać.

Wiem, że można wykorzystać metody super(); i uzupełnić konstruktor klasy Wear o pola z konstruktora klasy Person, co poskutkuje logicznie ubraną już postać.
Ja chciałbym stworzyć najpierw obiekt klasy Person, który jest całkowicie "bez ubrania", a dopiero potem ten obiekt "ubrać". Podsumowując chciałbym uniknąć ścisłej zależności między tymi dwoma klasami i chciałbym, żeby klasa Person była całkowicie niezależną klasą od klasy Wear.

Próbowałem wielu opcji - chociażby wywołanie w Main metody z Person, która wywołuje metodę z klasy Wear - co nawet dla mnie, jako początkującego było logiczne, że raczej nie o to chodzi.
Teraz myślę, że jestem na dobrej drodze i pytanie - czy w konstruktorze klasy nadrzędnej dobrą praktyką jest tworzenie obiektu klasy podrzędnej?
Do tego skutkiem moich wypocin jest zmiana dostępu do pól w klasie Wear z private na protected.
Poniżej znajduje się mój kod podzielony na odpowiednie klasy. Byłbym bardzo wdzięczny za nakierowanie / podpowiedź / wskazanie dobrych praktyk. Dziękuję. :)

Klasa main:

public class Main   {
    public static void main(String args[])  {
        Person adrian = new Person("Adrian","Nazwisko", 99, 250, 320);
        adrian.setTop("Koszula", 2);
        System.out.println(adrian.getTop());

    }
}

Klasa Person:

public class Person {
    private String name;
    private String surname;
    private int age;
    private int height;
    private int weight;
    private Wear wear;
    public Person(String name, String surname, int age, int height, int weight) {
        this.name = name;
        this.surname = surname;
        this.age = age;
        this.height = height;
        this.weight = weight;
        wear = new Wear();
    }
    public Person() {
    }

    public void setTop(String nazwa, int kolor)  {
        wear.topName = nazwa;
        wear.topColor = kolor;
    }
    public String getTop()    {
        return wear.topName;
    }
}

Klasa Wear:

public class Wear extends Person    {
    protected String topName;
    protected int topColor;
    private String bottomName;
    private int bottomColor;
    public Wear(String topName, int topColor, String bottomName, int bottomColor)   {
        this.topName = topName;
        this.topColor = topColor;
        this.bottomName = bottomName;
        this.bottomColor = bottomColor;
    }
    public Wear()   {
    }
}
edytowany 1x, ostatnio: Addy, 2018-12-17 20:03

Pozostało 580 znaków

2018-12-17 20:03
1

To co robisz nie ma sensu poniewaz Wear nie jest "Personą". Dziedziczenie to inaczej relacja "is". Nie ma żadnego sensu tutaj (ogólnie to rzadko ma sens) :D


Nie pomagam przez PM. Pytania zadaje się na forum.

Pozostało 580 znaków

2018-12-17 20:04
2

Podstawowy problem to sens tego dziedziczenia.
W twoim przypadku Wear jest Person. To wynika z napisu Wear extends Person.
Czyli nie tylko, że gacie mają wiek (age) (to się da zrozumieć), odziedziczony go po Person,
to jeszcze mają imię i nazwisko, a do tego własny ubiór.


Bardzo lubie Singletony, dlatego robię po kilka instancji każdego.
edytowany 2x, ostatnio: jarekr000000, 2018-12-17 20:04

Pozostało 580 znaków

2018-12-17 20:07
0

Wychodzi na to, że ktoś jest zboczony na punkcie ubioru :D
Ma to sens, dzięki za odpowiedź - rozumiem, że usuwam zależności. Widocznie nie zrozumiałem jeszcze do końca idei programowania obiektowego.
W takim razie rezygnuję też z dostępu do pól i ustawiam je znowu na "private". Pojawia się wtedy problem - wracam do punktu, gdy metodą wywołuję metodę, która wywołuje metodę.

Pozostało 580 znaków

2018-12-17 20:09
0

Pojawia się wtedy problem - wracam do punktu, gdy metodą wywołuję metodę, która wywołuje metodę - gdzie jest w tym problem? Normalka przecież.


Bardzo lubie Singletony, dlatego robię po kilka instancji każdego.
edytowany 1x, ostatnio: jarekr000000, 2018-12-17 20:09

Pozostało 580 znaków

2018-12-17 20:10
0

Nie no - na poważnie. Na samym początku chciałbym nabrać tych dobrych nawyków. Dopiero potem robić jak prawdziwy programista :P

Pozostało 580 znaków

2018-12-18 13:03
0

Też poważnie pisałem. Wywoływanie metod to jak najbardziej dobry nawyk.


Bardzo lubie Singletony, dlatego robię po kilka instancji każdego.

Pozostało 580 znaków

2018-12-18 20:19
0
Addy napisał(a):

Cześć. Jestem w trakcie poznawania tajników programowania obiektowego w Javie.
Stworzyłem klasę "Person", która jest klasą nadrzędną. Do tego powstała klasa "Wear", aby tą postać ubrać.

Sens dziedziczenia to właśnie wspomniane wyżej przez kolegów "jest" lub zwyczajnie, bezpośrednio z angielskiego tłumaczone "rozszerza". Relacja merytorycznie bez sensu, poniżej uwagi pomijające ten grzech pierworodny rozwiązania.

Wiem, że można wykorzystać metody super(); i uzupełnić konstruktor klasy Wear o pola z konstruktora klasy Person, co poskutkuje logicznie ubraną już postać.
Tak właśnie powinno się postępować. Konstruktor klasy super i tak jest wywoływany.

Ja chciałbym stworzyć najpierw obiekt klasy Person, który jest całkowicie "bez ubrania", a dopiero potem ten obiekt "ubrać". Podsumowując chciałbym uniknąć ścisłej zależności między tymi dwoma klasami i chciałbym, żeby klasa Person była całkowicie niezależną klasą od klasy Wear.

To trzeba było to zrobić tworząc dodatkową klasę:

DressedPerson extends Person{
  private Wear wear;
  public Person(String name, String surname, int age, int height, int weight, Wear wear){
    super(String name, String surname, int age, int height, int weight);
     this.wear = wear;
  }
}

Teraz myślę, że jestem na dobrej drodze i pytanie - czy w konstruktorze klasy nadrzędnej dobrą praktyką jest tworzenie obiektu klasy podrzędnej?

Tak, nawet jak go nie wpiszesz explicite, to i tak go wywołujesz;

Do tego skutkiem moich wypocin jest zmiana dostępu do pól w klasie Wear z private na protected.

Błąd, klasa dziedzicząca powinna używać metod dostępowych.

Poniżej znajduje się mój kod podzielony na odpowiednie klasy. Byłbym bardzo wdzięczny za nakierowanie / podpowiedź / wskazanie dobrych praktyk. Dziękuję. :)

Dziedziczenie okazało się przereklamowane. Bardziej praktyczną wersję klasy DressedPerson wg. atktualnej mody byłoby coś na kształt:

public class DressedPerson{
  private Person person;
  private Wear wear;
....
}

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0