34_繼承的綜合案例
第三十四章 繼承的綜合案例
作者:張子默
一、綜合案例:群主發普通紅包
群主發普通紅包。某群有多名成員,群主給成員發普通紅包。普通紅包的規則:
- 群主的一筆金額,從群主餘額中扣除,平均分成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();
}
}
相關文章
- prefer 組合 to 繼承繼承
- 【Java】繼承、抽象、組合Java繼承抽象
- 組合優於繼承繼承
- JavaScript中的繼承和組合JavaScript繼承
- odoo 繼承(owl繼承、web繼承、view繼承)Odoo繼承WebView
- Docker的組合優於繼承 - frankelDocker繼承
- 類的組合與繼承——作業繼承
- js 組合繼承詳解JS繼承
- Javascript繼承4:潔淨的繼承者—-原型式繼承JavaScript繼承原型
- javascript組合繼承的基本原理JavaScript繼承
- python物件導向的繼承-組合-02Python物件繼承
- 原型,繼承——原型繼承原型繼承
- 菱形繼承,虛繼承繼承
- C++中公有繼承、保護繼承、私有繼承的區別C++繼承
- 專題課:綜合案例6
- 類的繼承_子類繼承父類繼承
- 多繼承 與 多重繼承繼承
- 類的組合、繼承、模板類、標準庫繼承
- Javascript繼承2:建立即繼承—-建構函式繼承JavaScript繼承函式
- Pyhon的繼承繼承
- Java的繼承Java繼承
- 類的繼承繼承
- koa、koa-router、nunjucks 綜合案例
- RecyclerView封裝庫和綜合案例View封裝
- v-for,v-bink,綜合案例
- 園區網部署配置綜合案例
- 繼承繼承
- 什麼是繼承?Python繼承的特徵有哪些?繼承Python特徵
- 【設計模式】如何用組合替代繼承設計模式繼承
- RecyclerView綜合案例庫和系列部落格View
- day23:單繼承&多繼承&菱形繼承&__init__魔術方法繼承
- Solidity中的繼承Solid繼承
- java中的繼承Java繼承
- 20200109 - 類的繼承繼承
- PostgreSQL中的繼承SQL繼承
- JavaScript中的繼承JavaScript繼承
- 繼承的特點繼承
- Python類的繼承Python繼承