2.54.接口:让商品类型更丰富

看例程:学习接口的定义

看例程:学习接口的实现和接口引用的使用

看例程:学习接口的继承

// >> TODO 接口的定义使用interface,而非class
// >> TODO 接口中的方法,就是这个类型的规范,接口专注于规范,怎么实现这些规范,它不管
// >> TODO 接口无法被实例话,也就是不可以new一个接口的实例。
public interface ExpireDateMerchandise {

    // >> TODO 接口里的方法都是public abstract修饰的,方法有名字,参数和返回值,没有方法体,以分号;结束,
    // TODO 接口注释最好写一下
    /**
     * 截止到当前,商品的保质期天数是否超过传递的天数
     *
     * @param days 截止到当前,保质期超过这么多天
     * @return 截止到当前,true如果保质期剩余天数比参数长,false如果保质期不到这多天
     */
    boolean notExpireInDays(int days);

    // >> TODO 因为接口里的方法都是且只能用public abstract修饰,所以这俩修饰符可以省略
    // >> TODO abstract就是抽象方法的修饰符,没有方法体,以分号结束
    /**
     * @return 商品生产日期
     */
    Date getProducedDate();

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

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


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

    // >> TODO 接口里不能定义局部变量,定义的变量默认都是public static final的,这三个修饰符同样可以省略

    public static final int VAL_IN_INTERFACE = 999;

}
// >> TODO 一个类只能继承一个父类,但是可以实现多个接口
// >> TODO 如果实现的接口里定义了一样的方法,那么也没问题。但是要求方法名,参数,返回值类型都必须一摸一样。
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;
    }

    // >> TODO 一个类实现接口,就是从接口继承了抽象方法
    public boolean notExpireInDays(int days) {
        return daysBeforeExpire() > days;
    }

    public Date getProducedDate() {
        return produceDate;
    }

    public Date getExpireDate() {
        return expirationDate;
    }

    public double leftDatePercentage() {
        return 1.0 * daysBeforeExpire() / (daysBeforeExpire() + daysAfterProduce());
    }

    public double actualValueNow(double leftDatePercentage) {
        return soldPrice;
    }

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

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


}
// >> TODO 接口甚至可以没有任何方法的定义,只是规定一种类型
public interface VirtualMerchandise {
}
// >> TODO 接口也可以继承接口。接口可以继承多个接口,接口之间的继承要用extends
// >> TODO 接口不可以继承类
// >> TODO 继承的接口,可以有重复的方法,但是签名相同时,返回值必须完全一样,否则会有编译错误
public interface Intf3 extends Intf1, Intf2{
    void m3();
}

接口甚至可以没有任何方法的定义,只是规定一种类型

接口也可以继承接口。接口可以继承多个接口,接口之间的继承要用extends
接口不可以继承类
继承的接口,可以有重复的方法,但是签名相同时,返回值必须完全一样,否则会有编译错误

一个类只能继承一个父类,但是可以实现多个接口
如果实现的接口里定义了一样的方法,那么也没问题。但是要求方法名,参数,返回值类型都必须一摸一样。

一个类实现接口,就是从接口继承了抽象方法

接口的定义使用interface,而非class
接口中的方法,就是这个类型的规范,接口专注于规范,怎么实现这些规范,它不管
接口无法被实例话,也就是不可以new一个接口的实例。

接口里的方法都是public abstract修饰的,方法有名字,参数和返回值,没有方法体,以分号;结束,
接口注释最好写一下

因为接口里的方法都是且只能用public abstract修饰,所以这俩修饰符可以省略
就是抽象方法的修饰符,没有方法体,以分号结束

接口里不能定义局部变量,定义的变量默认都是public static final的,这三个修饰符同样可以省略

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

猜你喜欢

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