Skip to main content
added 1 character in body
Source Link
AJNeufeld
  • 8.7k
  • 1
  • 32
  • 46

You need a base type, or perhaps an interface which your other types can implement.

interface Positioned { int getX(); int getY(); } class Water implements Positioned { int getX() { return xLoc; } ... } 

Perhaps an Edible implements Positioned interface, etc.

Then, wut2Eat() could return an Edible instead of an Object.


Here is a more concrete example (Java8)

interface Positioned { int getX(); int getY(); default int distanceTo(Positioned pos) { int dx = pos.getX() - getX(); int dy = pos.getY() - getY(); return (int) Math.sqrt(dx*dx + dy*dy); } } interface Edible extends Positioned { int getNutritionalValue(); } interface Agent extends Positioned { Edible wat2Eat(); default Edible closestFood(List<Edible> food) { // code to find closest edible food in given list } } abstract class AbstractFood implements Edible, Positioned { int locX, locY; int getX() { return locX; } // ... etc ... } class Water extends AbstractFood { // ... } class Dinosaur extends AbstractFood, implements Agent { Edible wat2Eat() { if ( hungry ) { if (isHerbivorisHerbivore()) return closestFood(grasses); else return closestFood(dinosaurs); else return closestFood(waters); // ... } 

No need to repeat code in closestGrass() / closestDinosaur() / closestWater().

Adapt as required.

You need a base type, or perhaps an interface which your other types can implement.

interface Positioned { int getX(); int getY(); } class Water implements Positioned { int getX() { return xLoc; } ... } 

Perhaps an Edible implements Positioned interface, etc.

Then, wut2Eat() could return an Edible instead of an Object.


Here is a more concrete example (Java8)

interface Positioned { int getX(); int getY(); default int distanceTo(Positioned pos) { int dx = pos.getX() - getX(); int dy = pos.getY() - getY(); return (int) Math.sqrt(dx*dx + dy*dy); } } interface Edible extends Positioned { int getNutritionalValue(); } interface Agent extends Positioned { Edible wat2Eat(); default Edible closestFood(List<Edible> food) { // code to find closest edible food in given list } } abstract class AbstractFood implements Edible, Positioned { int locX, locY; int getX() { return locX; } // ... etc ... } class Water extends AbstractFood { // ... } class Dinosaur extends AbstractFood, implements Agent { Edible wat2Eat() { if ( hungry ) { if (isHerbivor()) return closestFood(grasses); else return closestFood(dinosaurs); else return closestFood(waters); // ... } 

No need to repeat code in closestGrass() / closestDinosaur() / closestWater().

Adapt as required.

You need a base type, or perhaps an interface which your other types can implement.

interface Positioned { int getX(); int getY(); } class Water implements Positioned { int getX() { return xLoc; } ... } 

Perhaps an Edible implements Positioned interface, etc.

Then, wut2Eat() could return an Edible instead of an Object.


Here is a more concrete example (Java8)

interface Positioned { int getX(); int getY(); default int distanceTo(Positioned pos) { int dx = pos.getX() - getX(); int dy = pos.getY() - getY(); return (int) Math.sqrt(dx*dx + dy*dy); } } interface Edible extends Positioned { int getNutritionalValue(); } interface Agent extends Positioned { Edible wat2Eat(); default Edible closestFood(List<Edible> food) { // code to find closest edible food in given list } } abstract class AbstractFood implements Edible, Positioned { int locX, locY; int getX() { return locX; } // ... etc ... } class Water extends AbstractFood { // ... } class Dinosaur extends AbstractFood, implements Agent { Edible wat2Eat() { if ( hungry ) { if (isHerbivore()) return closestFood(grasses); else return closestFood(dinosaurs); else return closestFood(waters); // ... } 

No need to repeat code in closestGrass() / closestDinosaur() / closestWater().

Adapt as required.

Expanded example
Source Link
AJNeufeld
  • 8.7k
  • 1
  • 32
  • 46

You need a base type, or perhaps an interface which your other types can implement.

interface Positioned { int getX(); int getY(); } class Water implements Positioned { int getX() { return xLoc; } ... } 

Perhaps an Edible implements Positioned interface, etc.

Then, wut2Eat() could return an Edible instead of an Object.


Here is a more concrete example (Java8)

interface Positioned { int getX(); int getY(); default int distanceTo(Positioned pos) { int dx = pos.getX() - getX(); int dy = pos.getY() - getY(); return (int) Math.sqrt(dx*dx + dy*dy); } } interface Edible extends Positioned { int getNutritionalValue(); } interface Agent extends Positioned { Edible wat2Eat(); default Edible closestFood(List<Edible> food) { // code to find closest edible food in given list } } abstract class AbstractFood implements Edible, Positioned { int locX, locY; int getX() { return locX; } // ... etc ... } class Water extends AbstractFood { // ... } class Dinosaur extends AbstractFood, implements Agent { Edible wat2Eat() { if ( hungry ) { if (isHerbivor()) return closestFood(grasses); else return closestFood(dinosaurs); else return closestFood(waters); // ... } 

No need to repeat code in closestGrass() / closestDinosaur() / closestWater().

Adapt as required.

You need a base type, or perhaps an interface which your other types can implement.

interface Positioned { int getX(); int getY(); } class Water implements Positioned { int getX() { return xLoc; } ... } 

Perhaps an Edible implements Positioned interface, etc.

Then, wut2Eat() could return an Edible instead of an Object.

You need a base type, or perhaps an interface which your other types can implement.

interface Positioned { int getX(); int getY(); } class Water implements Positioned { int getX() { return xLoc; } ... } 

Perhaps an Edible implements Positioned interface, etc.

Then, wut2Eat() could return an Edible instead of an Object.


Here is a more concrete example (Java8)

interface Positioned { int getX(); int getY(); default int distanceTo(Positioned pos) { int dx = pos.getX() - getX(); int dy = pos.getY() - getY(); return (int) Math.sqrt(dx*dx + dy*dy); } } interface Edible extends Positioned { int getNutritionalValue(); } interface Agent extends Positioned { Edible wat2Eat(); default Edible closestFood(List<Edible> food) { // code to find closest edible food in given list } } abstract class AbstractFood implements Edible, Positioned { int locX, locY; int getX() { return locX; } // ... etc ... } class Water extends AbstractFood { // ... } class Dinosaur extends AbstractFood, implements Agent { Edible wat2Eat() { if ( hungry ) { if (isHerbivor()) return closestFood(grasses); else return closestFood(dinosaurs); else return closestFood(waters); // ... } 

No need to repeat code in closestGrass() / closestDinosaur() / closestWater().

Adapt as required.

Source Link
AJNeufeld
  • 8.7k
  • 1
  • 32
  • 46

You need a base type, or perhaps an interface which your other types can implement.

interface Positioned { int getX(); int getY(); } class Water implements Positioned { int getX() { return xLoc; } ... } 

Perhaps an Edible implements Positioned interface, etc.

Then, wut2Eat() could return an Edible instead of an Object.