2.56.抽象类:有方法代码的接口

在 Java 8 中,接口中允许有缺省实现的抽象方法

看例程:不用抽象类,而是使用缺省方法的接口

// >> TODO 缺省的实现方法,用default修饰,可以有方法体
public interface ExpireDateMerchandise {

    // >> TODO 缺省的实现方法,用default修饰,可以有方法体
    /**
     * 截止到当前,商品的保质期天数是否超过传递的天数
     *
     * @param days 截止到当前,保质期超过这么多天
     * @return 截止到当前,true如果保质期剩余天数比参数长,false如果保质期不到这多天
     */
    default boolean notExpireInDays(int days) {
        return daysBeforeExpire() > days;
    }

    /**
     * @return 商品生产日期
     */
    Date getProducedDate();

    /**
     * @return 商品保质期到期日
     */
    public abstract Date getExpireDate();

    /**
     * @return 截止到当前,剩余保质期还剩下总保质期长度的百分比
     */
    default double leftDatePercentage() {
        return 1.0 * daysBeforeExpire() / (daysBeforeExpire() + daysAfterProduce());
    }

    /**
     * 根据剩余的有效期百分比,得出商品现在实际的价值
     *
     * @param leftDatePercentage 剩余有效期百分比
     * @return 剩余的实际价值
     */
    double actualValueNow(double leftDatePercentage);

    // >> TODO 接口中可以有私有方法,不需要用default修饰
    // >> TODO 接口里的私有方法,可以认为是代码直接插入到使用的地方
    private long daysBeforeExpire() {
        long expireMS = getExpireDate().getTime();
        long left = expireMS - System.currentTimeMillis();
        if (left < 0) {
            return -1;
        }
        // 返回值是long,是根据left的类型决定的
        return left / (24 * 3600 * 1000);
    }

    private long daysAfterProduce() {
        long produceMS = getProducedDate().getTime();
        long left = System.currentTimeMillis() - produceMS;
        if (left < 0) {
            return -1;
        }
        // 返回值是long,是根据left的类型决定的
        return left / (24 * 3600 * 1000);
    }

}
import java.util.Date;

// >> TODO 实现有缺省方法的接口后,面对每个缺省的方法,一个类可以有三个选择
//    TODO 1)默默继承,相当于把这部分代码,拷贝到了当前类当中
//    TODO 2)重新声明此方法为abstract,相当于把这部分代码拒之门外,但是有abstract方法,也就是类必须是抽象的
//    TODO 3)覆盖,重新实现

public class GamePointCard extends MerchandiseV2 implements ExpireDateMerchandise, VirtualMerchandise {
    private Date produceDate;
    private Date expirationDate;


    public GamePointCard(String name, String id, int count, double soldPrice, double purchasePrice, Date produceDate, Date expirationDate) {
        super(name, id, count, soldPrice, purchasePrice);
        this.produceDate = produceDate;
        this.expirationDate = expirationDate;
    }

    @Override
    public Date getProducedDate() {
        return produceDate;
    }

    @Override
    public Date getExpireDate() {
        return expirationDate;
    }

    @Override
    public double actualValueNow(double leftDatePercentage) {
        return super.getSoldPrice();
    }


}

缺省的实现方法,用default修饰,可以有方法体

接口中可以有私有方法,不需要用default修饰
接口里的私有方法,可以认为是代码直接插入到使用的地方

实现有缺省方法的接口后,面对每个缺省的方法,一个类可以有三个选择
1)默默继承,相当于把这部分代码,拷贝到了当前类当中
2)重新声明此方法为abstract,相当于把这部分代码拒之门外,但是有abstract方法,也就是类必须是抽象的
3)覆盖,重新实现

发布了57 篇原创文章 · 获赞 0 · 访问量 482

猜你喜欢

转载自blog.csdn.net/weixin_45471415/article/details/104815458