Это то, что должен решить полиморфизм, и одно из больших различий между процедурным и программированием. Вы можете достичь этого путем расширения базового класса или путем реализации интерфейса. Здесь расширяет базовый класс:
public abstract class Building {
abstract void destroy();
}
public BrickBuilding extends Building {
@Override
public void destroy() {
bricks.fallToGround();
}
}
public HayBuilding extends Building {
@Override
public void destroy() {
straw.blowInWind();
}
}
В местах в вашем коде, где вы бы использовали переключающее заявление для включения типа здания, просто держать ссылку на абстрактный Building
типа и вызов метода destroy()
на нем:
public class BuildingDestroyer {
public void rampage() {
for(Building building : allTheBuildings) {
// Could be a BrickBuilding, or a HayBuilding
building.destroy();
}
}
}
Или, на ваш вопрос о том, много мелких видов, вы можете «внедрить» в destroy
поведение, которое вы хотите в общий тип здания, как и ... albeing, вы будете в конечном итоге с много разных классов поведения по-разному ... так что это может быть не решение.
public interface DestroyBehaviour {
void destroy(Building building);
}
public class Building {
private int id;
public DestroyBehaviour destroyBehaviour;
public Building(int id, DestroyBehaviour destroyBehaviour) {
this.id = id;
this.destroyBehaviour = destroyBehaviour;
}
public void destroy() {
destroyBehaviour.destroy(this); // or something along those lines;
}
}