Przesłanianie metod w dziedziczeniu.

0

Cześć, mam pytanie dotyczące przesłaniania metod podczas dziedziczenia klas. Kiedy metoda z klasy bazowej zostanie przesłonięta przez metodę z klasy pochodnej, to możemy użyć słowa kluczowego super, aby wywołać przesłoniętą metodę. Znalazłem taki przykładowy program na necie:

package test1;

import java.util.Scanner;

class Vehicle {
    public void startEngine() {
        System.out.println("Tekst z klasy Vehicle");
    }
}
 
class Car extends Vehicle {
    public void startEngine() {
        super.startEngine();
        System.out.println("Tekst z klasy Car");
    }
}

public class Test1 {

   
    public static void main(String[] args) 
    throws java.io.IOException{
        
        Car ob1 = new Car();
        
        ob1.startEngine();
        
    }
    
}

Wynik działania programu jest następujący:

Tekst z klasy Vehicle
Tekst z klasy Car

I jak widać, po wywołaniu przesłoniętej metody za pomocą super, rzeczywiście została ona wywołana, ale niestety przy okazji została też wywołana metoda z klasy pochodnej, czyli pojawiły się dwa komunikaty. A da się zrobić tak, żeby żeby po wywołaniu metody za pomocą super, została wywołana tylko metoda z klasy bazowej, a nie jednocześnie pochodnej i bazowej? Czyli żeby w tym przypadku pojawił się jedynie komunikat "Tekst z klasy Car"?

1

Dlaczego chciałbyś coś takiego zrobić? Przeczy to całej idei zasłaniania metod.

Edit: zdaje się, że pomieszałeś nazewnictwo - w Twoim wypadku klasą bazową jest Vehicle, a klasą pochodną - Car. Czyli jeśli nie chcesz komunikatu Tekst z klasy Vehicle, nie wołaj super.startEngine();.

1

Oczywiście, że możesz tak zrobić. Ale kod napisałeś inny.

  1. Tworzysz obiekt typu Car.
  2. Wywołujesz jego metodę startEngine.
  3. Proces wchodzi w tą metodę i wykonuje po kolei instrukcje
  4. Widzi wywołanie Vehicle.startEngine, więc ją wywołuje
  5. Proces wchodzi do Vehicle.startEngine i widzi System.out.println("Tekst z klasy Vehicle"), więc drukuje wiadomość do konsoli
  6. Proces wychodzi z metody Vehicle.startEngine i wykonuje następne instrukcje
  7. Proces widzi System.out.println("Tekst z klasy Car"), więc drukuje wiadomość do konsoli
  8. Proces wychodzi z metody Car.startEngine
  9. KONIEC
    Jeśli nie chcesz, żeby metoda Vehicle.startEngine się wywoływała, to po co ją wywołujesz? Jak nie ogarniasz co się dzieje, proponuje sie zapiąć debugerem. Zobaczysz jak Java sobie skacze po metodach.
0

No dobra, ale jak stworzę obiekt klasy Car, która jest klasą pochodną, i będę chciał wywołać metodę z klasy bazowej Vehicle, która została przesłonięta (bo obie metody mogą mieć taki sam typ zwracany i argumenty, ale już np. ciało funkcji może być inne), to jak mogę wywołać metodę z klasy bazowej? Istnieje taka możliwość?

edit: właśnie mi chodzi o to, żeby stworzyć obiekt typu Car i za jego pomocą wywołać odziedziczoną metodę startEngine z klasy Vehicle, ale bez wywoływania metody startEngine z klasy Car.

1

Nie ma takiej możliwości - przesłanianie metod powstało z tą myślą, aby niezależnie od tego, co przyjmuje Twoja funkcja (czy to będzie Vehicle, czy Car), wołana była przesłonięta metoda.

0
Eszy napisał(a):

edit: właśnie mi chodzi o to, żeby stworzyć obiekt typu Car i za jego pomocą wywołać odziedziczoną metodę startEngine z klasy Vehicle, ale bez wywoływania metody startEngine z klasy Car.

To jej nie przesłaniaj :)

class Vehicle {
    public void startEngine() {
        System.out.println("Tekst z klasy Vehicle");
    }
}

class Car extends Vehicle {
    public void startCarEngine() {
        System.out.println("Tekst z klasy Car");
    }
}

public class Test1 {

    public static void main(String[] args)
            throws java.io.IOException {

        Car ob1 = new Car();

        ob1.startCarEngine();
        ob1.startEngine();
    }
}

//output
//Tekst z klasy Car
//Tekst z klasy Vehicle

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