You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:23:13