Необходимо реализовать абстрактный метод - PullRequest
1 голос
/ 07 мая 2019

Это использует Processing 3.5, здесь не все java-компоненты работают одинаково.
Класс Bird выдает ошибку, в которой говорится, что ему нужно реализовать call ().Разве это не под основной?У меня нет опыта работы с интерфейсами, поэтому я не знаю, что именно здесь происходит.

 public interface FuncCall<A> {
   A call();
 }

 class Bird implements FuncCall{
    //Error here ^
    //The type FuncCallTest.Bird must implement the inherited abstract method FuncCallTest.FuncCall.call()
    //Is this not implemented already under main?

   float x, y, size;
   ArrayList<FuncCall<Float>> inputs = new ArrayList<FuncCall<Float>>();

   public Bird(float x, float y, float size){
     this.x = x;
     this.y = y;
     this.size = size;
   }

   public void main(String[] args){

     FuncCall<Float> getX = new FuncCall<Float>(){
       @Override
       public Float call(){
           return x;
         }
     };

     FuncCall<Float> getY = new FuncCall<Float>(){
       @Override
       public Float call(){
         return y;
       }
     };

     FuncCall<Float> getSize = new FuncCall<Float>(){
       @Override
       public Float call(){
         return size;
       }
     };

     inputs.add(getX);
     inputs.add(getY);
     inputs.add(getSize);

   }

 }

 class Pol {

   ArrayList<FuncCall<Float>> inputs = new ArrayList<FuncCall<Float>>();

   public Pol(ArrayList<FuncCall<Float>> inputs){
     this.inputs = inputs;
   }

   //public float call(ArrayList<FuncCall<Float>> arr, int index){
     //return arr.get(index).call();
   //}
   //How do I do this? Do I need to implement the interface here as well? Because if so same error as on Bird

 }

Я также добавлю этот дополнительный бит в конец здесь.System.out.println(pol.call(pol.inputs, 1));
Будет ли это работать?Это не ошибка перед компиляцией.
Я ценю любую помощь.Пожалуйста, спросите, если что-то не имеет смысла, так как я все еще новичок в стеке и не лучший в Java.:)
основной файл:

 void setup(){

   Bird bird = new Bird(1.2, 3.2, 7.5);
   Pol pol = new Pol(bird.inputs);
   System.out.println(pol.call(pol.inputs, 1););
 }

1 Ответ

0 голосов
/ 07 мая 2019

Прежде всего вы можете пропустить свой интерфейс FuncCall и использовать функциональный интерфейс поставщика Java и просто добавить этих поставщиков соответственно методам ссылок ваших объектов класса в список. Другой подход заключается в предоставлении интерфейса или абстрактного класса, который имеет геттеры и / или переменные-члены для x, y и размера, и использует этот интерфейс или абстрактный класс в качестве параметра типа для списка.

  1. с поставщиками: Это ближе к вашему примеру и требует меньше изменений в ваш код. Второй вариант с интерфейсом меняет ваш класс Pol полностью, и я не уверен, приемлемо ли это для вас.

public class Bird {

      private float x;
      private float y;
      private float size;

       public Bird(float x, float y, float size) {
           //set your members here
       }

       public Float getX() {
            return this.x;
        }

        public Float getY() {
            return this.y;
        }

         public Float getSize() {
             return this.size;
          }
}

Тогда класс Pol '

public class Pol {

    private final List<Supplier<Float>> inputs;

    public Pol(List<Supplier<Float>> inputs) {
         this.inputs = inputs;
     }

     public Float call(int index) {
         return this.inputs.get(index).get();
     }
}

И ваш главный должен выглядеть '

public static int main(String[] args) {

    Bird bird = new Bird(1.0f, 1.0f, 2.5f);

     Pol pol = new Pol(Arrays.asList(bird::getX, 
     bird::getY, bird::getSize));
     Float birdsSize = pol.call(2);

     return 0;
}

...