У меня есть абстрактный класс 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: ");
}
}
Ты буквально там. Вы просто забыли распечатать звук в своем переопределенном методе.
@Override
public void makeNoise() {
System.out.println("Scream out load: " + getNoiseName());
}
doSomething
не имеет ничего общего с NoiseMaker
, поэтому я не уверен, зачем вам понадобиться эта функция вообще, если бы все, что вы хотели сделать, это распечатать какой-то шум.
Я оставлю опечатку подлинной проблемой, которую вам нужно решить (NoiceMaker
вместо NoiseMaker
), но остальная часть кода должна работать после добавления этого getNoiseName()
.
Во-первых, я вижу проблему с вашим 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();
}
}
Вот как использовать абстрактные классы в 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();
}
NoiseMaker
.
Просто наследуйте от абстрактного класса и переопределите абстрактный метод. Вы не можете вызвать абстрактный метод, они должны быть переопределены.
public class Test extend NoiseMaker { public void makeNoice() { System.out.println('hallo'); } }
Аннотации @Override
не нужны. Он будет работать без него.
Test.doSomething
для@Override
? ?Test
наследуется только отjava.lang.Object
которого нет методаdoSomething
.