Моя цель — понять принцип разделения интерфейса и одновременно добиться полиморфизма.
Мой ожидаемый результат: я могу добиться полиморфизма с помощью принципа разделения интерфейса.
Мой фактический результат: Нет, я не могу. Я вынужден создать шаблон и использовать принцип замещения Лискова (если есть рабочий, должен быть рабочий, который не может есть, поэтому создайте интерфейс для рабочего, который может есть, который расширяет рабочего). Я думаю, что неправильно понимаю принцип разделения интерфейса.
Это код, который нарушает принцип разделения интерфейса.
public interface IWorker {
void work();
void eat();
}
class Human implements IWorker {
public void work() {
System.out.println("Human is working.");
}
public void eat() {
System.out.println("Human is eating.");
}
}
class Robot implements IWorker {
public void work() {
System.out.println("Robot is working.");
}
public void eat() {
throw new UnsupportedOperationException("Robot cannot eat");
}
}
Мне сказали разделить интерфейс на 2.
public interface IEatable {
void eat();
}
interface IWorkable {
void work();
}
class Human implements IWorkable, IEatable {
public void work() {
System.out.println("Human is working.");
}
public void eat() {
System.out.println("Human is eating.");
}
}
class Robot implements IWorkable {
public void work() {
System.out.println("Robot is working.");
}
}
Решение состоит в том, чтобы использовать принцип подстановки Лисков.
public interface IWorkable {
void work();
}
interface IEatable {
void eat();
}
interface IWorker extends IWorkable {
}
interface IHumanWorker extends IWorker, IEatable {
}