Как получить доступ к методу в абстрактном классе

1

У меня есть абстрактный класс NoiseMaker с абстрактным методом makeNoise, который я хочу получить из класса Test. Мне нужно поместить код som в метод doSomething. Я просто не могу понять, что писать в нем. Я хочу, чтобы на выходе была "Scream out load: ROAR"

public interface MakeNoiser{
    public void doSomething();
}



public class Test implements MakeNoiser {
    public Test() {}

    public void setNoiseMaker(NoiceMaker nm) {
       nm.makeNoise();
    }

    @Override
    public void doSomething() {
        //What to write in this method to print out "ROAR"?
    }

    public static void main(String[] args) {
        Test t = new Test();
        t.setNoiseMaker(new Scream("ROAR"));
        t.doSomething();
    }    
}



public abstract class NoiseMaker {
    private String noiseName;

    public NoiseMaker(String noiseName) {
        this.noiseName= noiseName;
    }

    public abstract void makeNoise();

    public String getNoiseName() {
        return noiseName;
    }    
}



public class Scream extends NoiseMaker {    
    public Scream(String noiseName) {
        super(noiseName);
    }

    @Override
    public void makeNoise() {
        System.out.println("Scream out load: ");
    }    
}
  • 0
    Что такое Test.doSomething для @Override? ? Test наследуется только от java.lang.Object которого нет метода doSomething .
  • 0
    Извините, я забыл добавить интерфейс, который наследует Test-класс. У меня есть метод doSomething в этом интерфейсе.
Показать ещё 2 комментария
Теги:

4 ответа

2

Ты буквально там. Вы просто забыли распечатать звук в своем переопределенном методе.

@Override
public void makeNoise() {
    System.out.println("Scream out load: " + getNoiseName());
}

doSomething не имеет ничего общего с NoiseMaker, поэтому я не уверен, зачем вам понадобиться эта функция вообще, если бы все, что вы хотели сделать, это распечатать какой-то шум.

Я оставлю опечатку подлинной проблемой, которую вам нужно решить (NoiceMaker вместо NoiseMaker), но остальная часть кода должна работать после добавления этого getNoiseName().

  • 0
    Фактически создание Test подкласса NoiseMaker также будет необходимо
  • 0
    Не обязательно. Для него имеет больше смысла быть классом драйвера, чем другим расширением.
Показать ещё 4 комментария
1

Во-первых, я вижу проблему с вашим Test. Вы реализуете setNoisemaker, но вы не храните ссылку на этот NoiseMaker (например, имеете private NoiseMaker myNoiseMaker; в Test). Таким образом, вы не можете получить доступ к NoiseMaker (в данном случае к Scream) позже, чтобы вызвать makeNoise() на нем.

Я бы добавил поле myNoiseMaker, как показано выше, а затем в setNoiseMaker() вы можете сказать this.myNoiseMaker = nm; , Затем вы можете вызвать myNoiseMaker.makeNoise(); в doSomething().

Наконец, чтобы добавить "ROAR" к вашему утверждению, вам нужно добавить + getNoiseName() в метод makeNoise() Scream

РЕДАКТИРОВАТЬ

Повторное чтение, я думаю, вы можете добавить "ROAR" в метод doSomething(). В этом случае - я бы пошел на это (все остальные коды остались такими же):

public class Test implements MakeNoiser {
    public Test() {}

    private NoiseMaker myNoiseMaker;

    public void setNoiseMaker(NoiceMaker nm) {
       nm.makeNoise();
       myNoiseMaker = nm;
    }

    @Override
    public void doSomething() {
        //What to write in this method?
        myNoiseMaker.makeNoise();
        System.out.println(myNoiseMaker.getNoiseName());
    }

    public static void main(String[] args) {
        Test t = new Test();
        t.setNoiseMaker(new Scream("ROAR"));
        t.doSomething();
    }    
}
  • 0
    NoiseMaker - абстрактный класс, поэтому я не могу написать приватный NoiseMaker myNoiseMaker;
  • 0
    почему ты так думаешь? Я проверил свое решение - оно работает. Вы не можете создать экземпляр абстрактного класса, но у вас может быть закрытое (или публичное) поле члена с этим классом.
Показать ещё 3 комментария
1

Вот как использовать абстрактные классы в java.

public class Main {

    public static void main(String[] args) {

        Sounds s = new Sounds() {

            @Override
            public void lol() {
                System.out.print("hi");
            }

        };
        s.lol();
    }

}

abstract class Sounds {
    public abstract void lol();
}
  • 0
    Вы реализуете интерфейсы и расширяете классы. Вы также заметите, что OP уже создал подкласс NoiseMaker .
  • 0
    Test-class реализует интерфейс. Я обновил это сейчас. Но это не проблема, я думаю. Я хочу получить желаемый результат.
0

Просто наследуйте от абстрактного класса и переопределите абстрактный метод. Вы не можете вызвать абстрактный метод, они должны быть переопределены.

public class Test extend NoiseMaker { public void makeNoice() { System.out.println('hallo'); } }

Аннотации @Override не нужны. Он будет работать без него.

  • 0
    Извините, мне не разрешено наследовать от абстрактного класса (у меня есть UML, которому я должен следовать). Test-class реализует интерфейс.
  • 0
    Абстрактные классы предназначены для принудительного наследования от него. Это там только использование абстрактного. Может быть, вы делаете что-то не так.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню