如何用FancilyPrint接口的fancyPrint()替代Stack抽象类的print()方法?
问题描述
我在stacks包下有几个Java文件:
- 抽象类
Stack,包含public abstract void print()等抽象方法 - 接口
FancilyPrint,定义了void fancyPrint()方法 - 我正在编写
LinkedListStack类,它继承Stack同时实现FancilyPrint。这个类只需要使用fancyPrint(),完全不需要print()方法,但现在必须实现这个无用的方法,请问该怎么处理?
参考代码
Stack.java
package stacks; public abstract class Stack<AnyType> { public abstract void push(AnyType data); public abstract AnyType pop(); public abstract AnyType peek(); public abstract boolean isFull(); public abstract boolean isEmpty(); public abstract void print(); }
LinkedListStack.java
package stacks; import linkedlists.*; public class LinkedListStack<SomeType> extends Stack<SomeType> implements FancyPrint { LinkedList<SomeType> l = new LinkedList<>(); @Override public void push(SomeType data) { l.head_insert(data); } @Override public SomeType pop() { return l.delete_head(); } @Override public SomeType peek() { return l.headData(); } @Override public boolean isFull() { return false; } @Override public boolean isEmpty() { return l.isEmpty(); } @Override public void fancyPrint() { } // 这个方法对本类完全没用,只有其他继承Stack的子类需要它 @Override public void print() { } }
FancilyPrint.java
package stacks; public interface FancilyPrint { void fancyPrint(); }
解决办法
Java规定继承抽象类必须实现所有抽象方法,针对你的需求有两种实用方案:
1. 新增中间抽象类(不修改原有Stack类)
创建一个抽象类继承Stack,提前实现print()方法(可以是空实现,或者直接抛出异常避免被误调用),然后让LinkedListStack继承这个中间类,就不用自己写print()了。
示例中间类代码:
package stacks; public abstract class NoPrintStack<AnyType> extends Stack<AnyType> { @Override public void print() { // 如果不想让这个方法被调用,抛出异常明确告知 throw new UnsupportedOperationException("本类不支持print()方法,请使用fancyPrint()"); // 也可以留空实现:// do nothing } }
修改LinkedListStack的继承关系:
public class LinkedListStack<SomeType> extends NoPrintStack<SomeType> implements FancilyPrint { // 原有代码完全保留,无需再实现print()方法 }
2. 重构Stack的设计(若允许修改原有代码)
把print()方法从Stack抽象类中抽离到独立接口,比如Printable,这样需要print()功能的子类再去实现这个接口,LinkedListStack只需要实现FancilyPrint即可。
修改后的Stack类:
package stacks; public abstract class Stack<AnyType> { public abstract void push(AnyType data); public abstract AnyType pop(); public abstract AnyType peek(); public abstract boolean isFull(); public abstract boolean isEmpty(); // 移除print()抽象方法 }
新增Printable接口:
package stacks; public interface Printable { void print(); }
后续需要print()功能的子类,可以写成public class XXXStack extends Stack<XXX> implements Printable,而LinkedListStack完全不用管print()方法。
内容的提问来源于stack exchange,提问作者idkusrname126
相关产品推荐
相关产品推荐

