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

Protected, klasa abstrakcyjna

Object Storage Arubacloud
+1 głos
422 wizyt
pytanie zadane 25 września 2016 w Java przez Ehos Nowicjusz (240 p.)

Postanowiłem zabrać się do regularniejszej roboty z programowaniem, trafiłem jednak na pewien problem. Otóż dotychczas rzadko korzystałem z dziedziczenia. Była to dla mnie zbędna czarna magia. Jeśli już je robiłem to żeby jak najmniej mi przeszkadzało. Ostatnio trochę poczytałem i uznałem, że przy odpowiednim niewymuszonym podejściu jest to bardzo praktyczne. Ale nie o tym. Otóż dotychczas byłem przekonany, że wszystko co prywatne w klasie abstrakcyjnej dziedziczy się, ale nie ma do tego dostępu w klasie pochodnej. Z protected natomiast sytuację widziałem następująco. Dziedziczy się, klasa pochodna może się do tego pola odwoływać, ale dalej już się nie da. Tymczasem tworząc dwa obiekty różnych klas dziedziczących z jednej, wsadzając je do zbioru o typie klasy abstrakcyjnej mogę się odwoływać do pól protected. Zdaję sobie sprawę, że może to trochę mieszać, napisałem więc na szybko prosty kod, obrazujący tą sytuację.

Mamy program do wyliczania NWD. Klasa Main służy do komunikacji z użytkownikiem i wywołaniu funkcjonalności klas.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a;
        int b;
        System.out.println("podaj 1 liczbe");
        a=scanner.nextInt();
        System.out.println("podaj 2 liczbe");
        b=scanner.nextInt();

        NWD[] nwd = new NWD [2];
        nwd[0]=new SubtractingNWD(a,b);
        nwd[1]=new ModuloNWD(a,b);

        for (NWD n:
             nwd) {
            System.out.println(n.getNWD());
            System.out.println(n.a);
            System.out.println(n.b);
        }

    }

}

Następnie mamy klasę abstrakcyjną NWD

public abstract class NWD {
    protected int a;
    protected int b;
    NWD(int a, int b){
        this.a = a;
        this.b = b;
    }
    public abstract int getNWD();
}

Oraz klasy dziedziczące, jedna wyliczająca NWD poprzez reszty z dzielenia, a druga poprzez odejmowanie:

Modulo:

public class ModuloNWD extends NWD {
    public ModuloNWD(int a, int b){
        super(a, b);
    }

    public int getNWD() {
            int c;
            do{
                c=a%b;
                a=b;
                b=c;
            }while(b!=0);
            return a;

    }
}

Oraz odejmowanie:

public class SubtractingNWD extends NWD{


    SubtractingNWD(int a, int b) {
        super(a, b);
    }

    public int getNWD() {

            while(a!=b){
                if(a>b){
                    a=a-b;
                }else
                    b=b-a;
            }
            return a;

    }
}

 

Wiem, że w tej sytuacji mógłbym oczywiście podawać zmienne bezpośrednio do funkcji getNWD(), ale chciałbym zrozumieć dlaczego dzieje się tak jak się dzieje oraz dowiedzieć się czy da się to jakoś obejść? Domyślam się, że to kwestia tego, że oba obiekty są przypisane do typu klasy abstrakcyjnej i w ten sposób odwołujemy się do jej pól, ale...No w takim przypadku znowu dziedziczenie traci dla mnie swój urok. Trzaskać gettery i settery też mi się nie podoba, bo to taka pseudo-hermetyzacja i równie dobrze mógłbym zrobić tę zmienną publiczną.

2
komentarz 25 września 2016 przez Andrus19 Bywalec (2,260 p.)
edycja 25 września 2016 przez Andrus19
Trzaskać publiczne gettery i settery to oczywiście nie jest hermetyzacja. Wynieś te trzy klasy NWD do specjalnego pakietu(w końcu Main ma inne zadanie niż klasy NWD więc czemu trzymać je razem?) i nie będziesz mógł się odnieść bezpośrednio do pól NWD z klasy Main.

Zauważ że metodom też możesz ustawić modyfikatory dostępu więc nie musi to być to samo co zadeklarowanie pola jako public.

1 odpowiedź

+3 głosów
odpowiedź 25 września 2016 przez Porcupine Nałogowiec (31,560 p.)

 

Jeśli używasz modyfikatora protected to nie tylko klasy dziedziczące mają dostęp do danego pola / metody, ale też wszystkie klasy, które są w tym samym package. 

Co do samego pytania, mógłbyś spróbować troszkę jaśniej wyjaśnić co Twoim zdaniem jest nie tak jak być powinnno? 

komentarz 25 września 2016 przez Ehos Nowicjusz (240 p.)
O dziękuję za tabelkę, wiele wyjaśnia.
 

W sumie pytanie nie ma dalszego sensu biorąc pod uwagę, że widzialność jest trochę inna niż ta na którą dotychczas trafiałem. Wystarczy odpowiednie pakietowanie i protected by działał tak jak tego oczekiwałem. Niestety uznałem, że na początku pakiety są mi zbędne, bo przecież to takie małe, proste apki mają być.

Jeszcze raz dzięki ;)

Podobne pytania

0 głosów
0 odpowiedzi 282 wizyt
pytanie zadane 22 września 2019 w C i C++ przez niezalogowany
0 głosów
2 odpowiedzi 814 wizyt
0 głosów
2 odpowiedzi 332 wizyt

92,568 zapytań

141,422 odpowiedzi

319,638 komentarzy

61,957 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!

...