接口default实现 VS 借助抽象类

文章讨论了在Java中处理多个场景和实现类时的接口设计策略。方法一是通过定义接口A,创建一个抽象类B来实现接口,并在抽象类中提供默认实现,而子类根据需求重写特定方法。方法二是直接在接口中定义默认方法,同样在无法支持的方法内抛出异常,由实现类按需覆盖。这两种方式都允许不同场景的实现类共享同一接口,但实现细节各异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设一个场景
一个业务有多种场景,需要多个实现类,每个类实现的方法不一样,但是想共用一个接口。应该如何设计

方法一:
定义一个接口类A,用虚拟抽象类B实现接口A,然后多个实现类分别继承B。同时由于部分实现场景不能执行特地方法,将B实现全部报错,让实现类分别去实现各自需要的方法

public interface A2Service {
    void sing();

    void song();
}
public class A2AbstractService implements A2Service{
    @Override
    public void sing() {
        System.out.println("sing not support");
    }

    @Override
    public void song() {
        System.out.println("song not support");
    }
}
public class A2ServiceImpl1 extends A2AbstractService{
    @Override
    public void sing() {
        System.out.println("A2ServiceImpl1 sing");
    }
}
public class A2ServiceImpl2 extends A2AbstractService{

    @Override
    public void song() {
        System.out.println("A2ServiceImpl2 song");
    }

}

方法二:
定义一个接口类A,接口方法声明为default。同时由于部分实现场景不能执行特地方法,default方法内部执行全部报错,让实现类分别去实现各自需要的方法

public interface A1Service {
    default void sing() {
        System.out.println("sing not support");
    }

    default void song() {
        System.out.println("song not support");
    }
}
public class A1ServiceImpl1 implements A1Service{
    @Override
    public void sing() {
        System.out.println("A1ServiceImpl1 sing");
    }
}
public class A1ServiceImpl2 implements A1Service{
    @Override
    public void song() {
        System.out.println("A1ServiceImpl2 song");
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值