REFACTORING TO PRESERVE BEHAVIORAL SUBTYPING Wrong: public class Dequeue { public void addFront(Object o) {...} public void addRear(Object o) {...} /* ... */ } public class Stack extends Dequeue { public void addRear(Object o) { throw new ...Exception(); } } Better, Refactoring 1: public abstract class List { public void addFront(Object o) {...} /* ... */ } public class Dequeue extends List { public void addRear(Object o) {...} /* ... */ } public class Stack extends List { /* ... */ } ANOTHER REFACTORING public interface ListType { public void addFront(Object o); /* ... */ } public class Dequeue implements ListType { public void addFront(Object o) {...} public void addRear(Object o) {...} /* ... */ } public class Stack implements ListType { public void addFront(Object o) {...} public void addRear(Object o) {...} /* ... */ }