34_繼承的綜合案例

傻傻的張子默ing發表於2020-11-10

第三十四章 繼承的綜合案例

作者:張子默

一、綜合案例:群主發普通紅包

群主發普通紅包。某群有多名成員,群主給成員發普通紅包。普通紅包的規則:

  • 群主的一筆金額,從群主餘額中扣除,平均分成n等分,讓成員領取。
  • 成員領取紅包後,儲存到成員餘額中。

請根據描述,完成案例中所有類的定義以及指定類之間的繼承關係,並完成發紅包的操作。

二、案例分析

根據描述分析,得出如下繼承體系:

在這裡插入圖片描述

三、案例實現

定義使用者類:

public class User {

    // 成員變數
    private String username; // 使用者名稱
    private double leftMoney; // 餘額
    
    // 構造方法
    public User() { }
    public User(String username, double leftMoney) {
        this.username = username;
        this.leftMoney = leftMoney;
    }
    // get/set方法
    public String getUsername() {
	    return username;
    }
    
    public void setUsername(String username) {
    	this.username = username;
    }
    
    public double getLeftMoney() {
    	return leftMoney;
    }
    
    public void setLeftMoney(double leftMoney) {
    	this.leftMoney = leftMoney;
    }
    // 展示資訊的方法
    public void show() {
    	System.out.println("使用者名稱:"+ username +", 餘額為:" + leftMoney + "元");
    }
}

定義群主類:

public class QunZhu extends User {
    // 新增構造方法
    public QunZhu() {
    }
    
    public QunZhu(String username, double leftMoney) {
        // 通過super 呼叫父類構造方法
        super(username, leftMoney);
	}
    /*
    群主發紅包,就是把一個整數的金額,分層若干等份。
    1.獲取群主餘額,是否夠發紅包.
    不能則返回null,並提示.
    能則繼續.
    2.修改群主餘額.
    3.拆分紅包.
    3.1.如果能整除,那麼就平均分。
    3.2.如果不能整除,那麼就把餘數分給最後一份。
    */
    public ArrayList<Double> send(int money, int count) {
        // 獲取群主餘額
        double leftMoney = getLeftMoney();
        if(money > leftMoney) {
        	return null;
        }
        // 修改群主餘額的
        setLeftMoney(leftMoney ‐ money);
        
        // 建立一個集合,儲存等份金額
        ArrayList<Double> list = new ArrayList<>();
       
        // 擴大100倍,相當於折算成'分'為單位,避免小數運算損失精度的問題
        money = money * 100;
       
        // 每份的金額
        int m = money / count;
        // 不能整除的餘數
        int l = money % count;
        
        // 無論是否整除,n‐1份,都是每份的等額金額
        for (int i = 0; i < count ‐ 1; i++) {
            // 縮小100倍,折算成 '元'
            list.add(m / 100.0);
        }
       
        // 判斷是否整除
        if (l == 0) {
            // 能整除, 最後一份金額,與之前每份金額一致
            list.add(m / 100.0);
        } else {
            // 不能整除, 最後一份的金額,是之前每份金額+餘數金額
            list.add((m + l) / 100.00);
        }
       
        // 返回集合
        return list;
    }
}

定義成員類:

public class Member extends User {
    public Member() {
    }
    
    public Member(String username, double leftMoney) {
    	super(username, leftMoney);
    }
    // 開啟紅包,就是從集合中,隨機取出一份,儲存到自己的餘額中
    public void openHongbao(ArrayList<Double> list) {
        // 建立Random物件
        Random r = new Random();
        // 隨機生成一個角標
        int index = r.nextInt(list.size());
        // 移除一個金額
        Double money = list.remove(index);
        // 直接呼叫父類方法,設定到餘額
        setLeftMoney( money );
    }
}

定義測試類:

public class Test {
    public static void main(String[] args) {
        
        // 建立一個群主物件
        QunZhu qz = new QunZhu("群主", 200);
        
        // 建立一個鍵盤錄入
        Scanner sc = new Scanner();
        System.out.println("請輸入金額:");
        int money = sc.nextInt();
        System.out.println("請輸入個數:");
        int count = sc.nextInt();
        
        // 傳送紅包
        ArrayList<Double> sendList = s.send(money,count);
        
        // 判斷,如果餘額不足
        if(sendList == null){
            System.out.println(" 餘額不足...");
            return;
        }
        
        // 建立三個成員
        Member m = new Member();
        Member m2 = new Member();
        Member m3 = new Member();
        // 開啟紅包
        m.openHongbao(sendList);
        m2.openHongbao(sendList);
        m3.openHongbao(sendList);
        // 展示資訊
        qz.show();
        m.show();
        m2.show();
        m3.show();
    }
}

t);
m2.openHongbao(sendList);
m3.openHongbao(sendList);
// 展示資訊
qz.show();
m.show();
m2.show();
m3.show();
}
}


相關文章