ArrayList - wywoływanie metody z klasy dziedziczącej

0

Witam,
mam problem z jednym zadań z javy... Chodzi o stworzenie parkingu dla samochodów poprzez ArrayList. Auta dodawane do "parkingu" należą do 4 różnych klas (Car, Sport, F1, Truck) z tym, że Sport i Truck dziedziczą po Car, a F1 dziedziczy po sport. W każdej z tych klas są różne metody do których muszę się później odwołać... i właśnie z tym jest problem - kompilator tak jakby nie widzi tego dziedziczenia i pozwala odnieść się tylko do metod zawartych w klasie Car... Kod poniżej. Generalnie chodzi też o to żeby np elementy z klasy Sport nie miały dostępu do metod z klasy Truck i odwrotnie.
Z góry dziękuje za szybką pomoc.

klasa główna:

 
package parkings;

import java.util.ArrayList;


public class Parkings 
{

    public static void main(String[] args) 
    {
        
        Car c1 = new Car();
        Car c2 = new Car();
        Car c3 = new Car();
        Sport s1 = new Sport();
        Sport s2 = new Sport(false, 250);
        Sport s3 = new Sport(true, 190);
        F1 f1 = new F1();
        F1 f2 = new F1();
        F1 f3 = new F1();
        Truck t1 = new Truck(false, 350, 1500.50);
        
        
     ArrayList<Car> parking = new ArrayList<>();
     
      parking.add(c1);
      parking.add(c2);
      parking.add(c3);
      parking.add(s1);
      parking.add(s2);
      parking.add(s3);
      parking.add(f1);
      parking.add(f2);
      parking.add(f3);
      parking.add(t1);
      
      
      parking.get(0).start();
      parking.get(2).start(); 
      parking.get(9).start();
}
}


klasa Car

package parkings;

public class Car 
{
    public void start()
    {
        
    }
    public boolean start;

    public boolean isStart() 
    {
        return start;
    }

    public void setStart(boolean start) 
    {
        this.start = start;
    }

 Car()
    {
        
    }

    public Car(boolean start) 
    {
        this.start = start;
        
        
        
        
    }
    
    }
    
    

 

klasa Sport

 
package parkings;

public class Sport extends Car
{
    
    public int power;
   
    public int getPower() 
    {
        return power;
    }
   
    public void setPower(int power) 
    {
        this.power = power;
    }

    Sport()
    {
        super();
    }

    public Sport(boolean start, int power) 
    {
        super(start);
        this.power = power;
        
    }
    
    
    
}

klasa Truck

package parkings;

public class Truck extends Car
{
    
    public double load;
    
    
    public double getLoad() 
    {
        return load;
    }
    
    public void setLoad(double load) 
    {
        this.load = load;
    }

    Truck()
    {
        
    }
    
    public Truck(boolean start, int power, double load)
    {
        super(start, power);
        this.load = load;
       
    }
    
}

poprawiłem znaczniki - bogdans

0

Po pierwsze, nazywanie metod, pól i jeszcze argumentów metod tak samo w obrębie jednej klasy to straszne pomieszanie z poplątaniem i nie można dojść co jest co.

No wygląda to koszmarnie w klasie Car. Czym jest start?

nie pokazałeś klasy F1
a w klasie Truck w konstruktorze wywołujesz konstruktor klasy nadrzędnej z parametrami jak od klasy Sport.

Ja nic nie rozumiem

Dodatkowo jeżeli wywołasz konstruktor klasy dziedziczącej i tak wywołają Ci się automatycznie "nad" konstruktory także nie musisz ich wywoływać ręcznie, bo to bez sensu

0

Dobra, dzięki za pomoc anyway - rozwiązanie jest bardzo proste, wystarczyło użyć rzutowania :)
zamiast

 
parking.get(4).power = 150;

powinno byc

 
((Sport)(parking.get(4))).power = 150;

;)

0

Przede wszystkim odwołania do pól nie są polimorficzne, w przeciwieństwie do wywoływania metod (niestatycznych oczywiście). Dlatego poprawnym rozwiązaniem jest po prostu używanie getterów i setterów oraz oznaczenie pól jako prywatne.

Publiczne pola (prawie?) nigdy nie mają sensu.

0

@up: tyle [CIACH!] na raz...

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