eugene_leshchinskiy
@eugene_leshchinskiy

Как правильно реализовать метод интерфейса, если есть еще и абстрактный класс?

Всем привет. Есть интерфейс:

public interface Food {
    void ShowProperties();
}


Его реализует(точнее не известно как это назвать) абстрактный класс:

public abstract class Meal implements Food {

    @Override
    public abstract void ShowProperties();
}


И дальше уже реализация в последнем классе. Правильно ли так делать, использовать @Override и как бы пробрасывать метод далее по иерархии? Или может просто его реализовать в конечном классе, минуя абстрактный?
  • Вопрос задан
  • 306 просмотров
Решения вопроса 2
EugeneP2
@EugeneP2
Java Dev
абстрактный класс не нужен
Ответ написан
lxsmkv
@lxsmkv
Test automation engineer
В этом случае вам не нужно указывать этот метод в абстрактном классе. Он будет возмущаться пока кто-то его не реализует
Использование абстрактного класса дает вам возможность задать поведение по умолчанию. Даже если вы в абстрактном классе не определите тело методов интерфейса, а переложите все на конкретные классы, то использование абстрактного класса будет иметь смысл если в нем будет определен хоть один метод с общим для всех потомков поведением.
Был у меня как то пример такой:
Два типа работников ленивый и усердный наследуются от абстрактного работника. Абстрактный Работник был наблюдателем (интерфейс) и реагировал на счетчик времени в симуляции. В абстрактном классе определен метод рассчета количества сделаной работы. Причем параметры для расчета задекларированы в абстрактном классе. А в конкретный работник в конструкторе указывает значения этих параметров
Вот кусок из main
Clock cl = new Clock();
HardWorker hw = new HardWorker();
cl.addObserver(hw);
		for(int i=daystart;i<=dayend;i++){
			cl.tick();
		}

Вот абстрактный работник
import java.util.Observable;
import java.util.Observer;
import java.util.Random;

public abstract class AbstractWorker implements Observer {
	protected double workunitsDone;
	protected int lunchUnitsDone;
	protected int lunchDuration;
	protected int lunchTotal;
	protected double productivity;
	boolean lunch=false;
	Random r = new Random();
	double  lunchProb;
	int lunchTaken=0;
	
	void setProgress() {
		if (lunch && lunchTaken<lunchDuration){
			lunchTaken=lunchTaken+1;
			lunchTotal=lunchTotal+1;
		}
		else{
			lunch=false;
			lunchTaken=0;
			if (r.nextInt(101)<lunchProb){ 
         lunch = true;
			}else{ 
         workunitsDone=workunitsDone+productivity;
			}
		}
	}
	double getWorkunitsDone(){ return workunitsDone;
	}
	int getLunchUnitsDone(){return lunchTotal;
	}
}

А вот усердный работник
import java.util.Observable;
import java.util.Random;

public class HardWorker extends AbstractWorker {
	public HardWorker() {
		super();
		this.lunchDuration = 6;
		this.lunchProb = 6;
		this.productivity=1.1;
	}
	@Override
	public void update(Observable o, Object arg) {
		setProgress();
	}
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы