Polimorfizm a dodawanie metod w podklasach

0

Witam,
Jestem dosyć początkującym programistą :D I tak pomyślałem, że może zadam tutaj pytanie nad którym zastanawiam się tak od pewnego czasu. A mianowicie - Jak mogę wykorzystać metody w klasach potomnych, jeśli te metody nie istnieją np w Interfejsie przez który tworze obiekty tych klas stosując zalety polimorfizmu.

Tutaj mam przykładowy kod który napisałem. I moje pytanie do tego kodu jest następujące. Po co tworzyć np. dodatkowe metody w klasach potomnych jeśli i tak nie mogę ich użyć. np. metoda "byleJaka()" w klasie Tort. A jeśli nie mogę ich użyc to po co tworzyć nowe klasy, które w sumie w tedy za dużo nie wnoszą.

Mój kod:

package pl.czaspoczasie.pakiet;
public class Prepare1 {
    public static void main(String[] args) {
        Wypiek w1 = new Tort("czekoladowy",(byte)12);
        System.out.println("Tort: " + w1.nazwa());
        w1 = new PolewaDoTortu(w1,"truskowakowy");
        System.out.println("Tort: " + w1.nazwa());
        w1.byleJaka(); ///BLAD NIE MA TAKIEJ METODY

    }
}

interface Wypiek{
    double cena();
    String nazwa();
}

class Tort implements Wypiek{
    protected String nazwa;
    protected String smak;
    protected double cena;
    protected byte iloscSwieczek;
    public Tort(String smak, byte iloscSwieczek){
        nazwa = "Tort";
        this.smak = smak;
        this.iloscSwieczek = iloscSwieczek;
        cena = 29.99;
    }
    @Override
    public double cena(){
        return cena;
    }
    @Override
    public String nazwa(){
        return nazwa+"\n\n Smak: "+smak+"\n ilosc swieczek: "+iloscSwieczek;
    }
    public void byleJaka(){
        System.out.pritnln("Byle jaka");
    }
}

class PolewaDoTortu implements Wypiek{
    private Wypiek w;
    private String smak;
    public PolewaDoTortu(Wypiek w, String smak){
        this.w = w;
        this.smak = smak;
    }
    @Override
    public double cena() {
        return w.cena()+5;
    }
    @Override
    public String nazwa() {
        return w.nazwa()+"\n Polewa: "+smak;
    } 
    void zablysk(){
        System.out.println("Blysku! Blysku!");
    }
}

class NapisDoTortu implements Wypiek{
    private Wypiek w;
    private String napis;
    public NapisDoTortu(Wypiek w, String napis){
        this.w = w;
        this.napis = napis;
    }
    @Override
    public double cena() {
        return w.cena()+3;
    }
    @Override
    public String nazwa() {
        return w.nazwa()+"\n Napis: "+napis;
    } 
    void wybuchnij(){
        System.out.println("Bach! Bach! Sto Lat!");
    }
}
0

Jak nie możesz użyć? Tworząc obiekt tworzysz go zgodnie z jego typem. Możesz sprawdzić czy w1 instanceof Tort i wtedy zrzutować obiekt w1 na Tort i wywołać metodę z klasy.

0

Rozwiązanie:

         Wypiek w1 = new Tort("czekoladowy",(byte)12);
         System.out.println("Tort: " + w1.nazwa());

        PolewaDoTortu  p1 = new PolewaDoTortu(w1,"truskowakowy");
        System.out.println("Tort: " + w1.nazwa());
        p1.zablysk(); //jest taka metoda
        w1 = p1;

Chodzi o to, że w pewnym kontekście możesz wiedzieć, że coś jest PolewąDoTortu (bo własnie to utworzyłeś) i korzystasz z dodatkowych metod.
Ale możesz gdzies metodę, która działa dla Wypieku w i korzysta tylko z tego co w interfejsie Wypiek.

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