Создание общего метода для двух классов, не использующих наследование в Java - PullRequest
0 голосов
/ 01 декабря 2018

Мне просто интересно, есть ли способ создать два класса, которые не связаны, но имеют одинаковую реализацию метода.Я знаю, что есть интерфейсы и статические методы, но кажется, что они хороши, только когда у вас есть статическое поле в классе.Возможно ли это сделать, когда метод использует поле, специфичное для конкретного объекта?Я знаю, что это плохая практика написания такого кода, но мне просто любопытно.

РЕДАКТИРОВАТЬ: Я имею в виду что-то вроде этого:

public class Person implements MakingOlder {
  private int age;
}

public class Cat implements MakingOlder {
  private int age;
}

public interface MakingOlder {
  public static void makeOlder() {
        this.age += 2;
  }
}

Я не хочу создавать общий базовый класс для Person и Cat, и интерфейс не работает.Я пытаюсь избежать написания одной и той же реализации дважды и копирования кода.

Ответы [ 3 ]

0 голосов
/ 02 декабря 2018

... или вы можете использовать реализацию по умолчанию в Java 8 + ...

public interface MakingOlder {

    public default void makeOlder() {
        setAge(getAge() + 2);
    }

    int getAge();

    void setAge(int age);

}

и, конечно, ваши Person и Cat реализуют MakingOlder ...

0 голосов
/ 02 декабря 2018

Возможно, ваш интерфейс не работает, потому что вы пытаетесь реализовать метод в интерфейсе:

public static void makeOlder() {
    this.age += 2;
}

Чтобы заставить его работать, попробуйте добавить ключевое слово default, чтобы оно выглядело как:

default Integer makeOlder(Integer age) {
    age += 2;
    return age;
}

Тогда класс, который реализует этот интерфейс, должен будет просто содержать что-то вроде:

public class Dummy implements AA {

    Integer age;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

Чтобы проверить результат, вы можете вызвать что-то вроде:

Dummy d = new Dummy();
d.setAge(d.makeOlder(7));
System.out.println(d.getAge());
d.setAge(d.makeOlder(d.getAge()));
System.out.println(d.getAge());
0 голосов
/ 02 декабря 2018

Конечно, это называется «состав + делегирование», и часто хорошей практикой является замена наследования следующим:

https://en.wikipedia.org/wiki/Composition_over_inheritance

public class Person implements AgingObject {
  private int age;  
  private AgingBehavior agingBehavior;

  void makeOlder() {
    agingBehavior.makeOlder(this);
  }
  //(...)
}

public class Cat implements AgingObject {
  private int age;
  private AgingBehavior agingBehavior;

  void makeOlder() {
    agingBehavior.makeOlder(this);
  }
  //(...)
}

public class AgingBehavior {
  void makeOlder(AgingObject agingObject) {
    agingObject.setAge(agingObject.getAge() + 2);
  }
}

public interface AgingObject {
    int getAge();
    void setAge(int age);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...