Program Bankomatu na podstawie Interface - zadanie

1

Cześć, mam taki problem, że gdy próbuję zaimplementować interface do klasy ATMImpl wyskakuje mi, że klasa musi być abstrakcyjna, a gdy ją na taka zmienię to nic nie mogę wyświetlić na ekranie.
Docelowe założenie jest taki aby wyświetlać wszystkie komunikaty(i jeszcze kilka więcej) oraz dodać też opcje wpłaty, nie tylko wypłaty.

Dzięki za pomoc
Pozdrawiam

interface Atm
{void atmAnswer();}
class Welcome implements Atm
{
public void atmAnswer(){
System.out.println("Welcome In Our ATM!");}
}
class Card implements Atm
{
public void atmAnswer(){
System.out.println("Enter Card");}
}
class Amount implements Atm
{
public void atmAnswer(){
System.out.println("Enter The Amount To Be Withdrawn");}
}
class Withdrawn implements Atm
{
public void atmAnswer(){
System.out.println("Proceed...");}
}
class ThankYou implements Atm
{
public void atmAnswer(){
System.out.println("Thank You For Using Our Services!");}
}
class ATMImpl
{
private Atm atm;
public ATMImpl(Atm atm)
{
this.atm = atm;
}
public void process()
{
System.out.println("Conecting To Bank's Network...");
System.out.println("Conected!");
this.atm.atmAnswer();
System.out.println("Network Disconected");
}
}
class Application
{
public static void main(String args[])
{
Atm welcome = new Welcome();
ATMImpl ATMImpl = new ATMImpl(welcome);
ATMImpl.process();

}

}

1

Na oko próbujesz zaimplementować maszynę stanów w Javie. Tu masz przykład jak to zrobić: https://en.wikipedia.org/wiki/State_pattern

3
interface Atm {
    void atmAnswer();
}
class Welcome implements Atm {
    public void atmAnswer() {
        System.out.println("Welcome In Our ATM!");
    }
}
class Card implements Atm {
    public void atmAnswer() {
        System.out.println("Enter Card");
    }
}
class Amount implements Atm {
    public void atmAnswer() {
        System.out.println("Enter The Amount To Be Withdrawn");
    }
}
class Withdrawn implements Atm {
    public void atmAnswer() {
        System.out.println("Proceed...");
    }
}
class ThankYou implements Atm {
    public void atmAnswer() {
        System.out.println("Thank You For Using Our Services!");
    }
}
class ATMImpl {
    private Atm atm;
    public ATMImpl(Atm atm) {
        this.atm = atm;
    }
    public void process() {
        System.out.println("Conecting To Bank's Network...");
        System.out.println("Conected!");
        this.atm.atmAnswer();
        System.out.println("Network Disconected");
    }
}
class Application {
    public static void main(String args[]) {
        Atm welcome = new Welcome();
        ATMImpl ATMImpl = new ATMImpl(welcome);
        ATMImpl.process();

    }
}

Ło panie co tu się odjaniepawla (zaraz będę komentował dalej).
Po pierwsze primo - nazwy są mega mylace. Atm to powinno być coś w rodzaju AtmStep.
Po drugie ATMImpl - czemu taka nazwa? przecież ATMImpl nic nie implementuje

że gdy próbuję zaimplementować interface do klasy ATMImpl wyskakuje mi, że klasa musi być abstrakcyjna

Ale który interfejs? Atm?

Jak dodasz public przed Application to wszystko działa (napis się wyświetla) więc nie wiem jaki masz do końca problem.
Chyba że chodzi ci o coś w rodzaju

class ATMImpl implements Atm {
    private Atm atm;
    public ATMImpl(Atm atm) {
        this.atm = atm;
    }
    public void atmAnswer() {
        System.out.println("Conecting To Bank's Network...");
        System.out.println("Conected!");
        this.atm.atmAnswer();
        System.out.println("Network Disconected");
    }
}
0
interface Atm
{
void atmAnswer();
}


Przecież to chore. Co niby w "realnym życiu" ten interfejs wyraża?
Z voidem ...
Wyraża wszystko przeciwne temu, o co chodzi w projektowaniu wg interfejsów: tutaj WYMAGA SIĘ dziubania efektami ubocznymi, a nie realnym określeniem przez interface skąd - co (jaki typ/typy) - dokąd

Jak tak się masz uczyć programowania obiektowego, to lepiej się nie ucz wcale, przynajmniej nie nauczysz się źle.

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