使用面向对象的多态性模仿会员卡消费系统,设计会员卡类,可派生不同的会员卡类型,当使用不同的会员卡消费时其折扣不同。如一般会员卡消费打9折;VIP会员卡打7折;超级VIP卡打5折。其具体的实现效果如下所示:
输入应消费的金额->选择相应的会员卡->显示实际的应付金额和消费状态信息。
实验要求:
- 程序设计必须符合面向对象的编程思想;
- 设计会员卡类,包含卡类型和卡内金额两个属性;
- 由会员卡类进一步派生出不同类型的会员卡,如:一般会员卡消费打9折;VIP会员卡打7折;超级VIP卡打5折;
- 对不同会员卡类进行具体实现;
- 设计并实现刷卡机类,主要用于人机交互和显示消费状态信息;
- 创建不同类型会员卡的具体对象,并进行相应调用显示消费状态信息。
实验目的
- 掌握方法的继承,重载与覆盖;
- 掌握抽象类的定义与继承;
- 理解多态的概念,掌握接口的实现方法。
package nchu.demo1;
import java.util.Scanner;
public class Membership1 {
private String kind; //会员卡类型
private double discount; //折扣大小
private double balance; //余额
public Membership1() {
}
public String getKind() {
return kind;
}
public void setBalance(double balance) {
this.balance = balance;
}
public double getBalance() {
return balance;
}
public double getDiscount() {
return discount;
}
public double deduct(double x){
return getBalance()-x*getDiscount();
}
//改变余额的方法
public double lastBalance(double x){
setBalance(getBalance()-x*getDiscount());
return getBalance();
}
}
class AMembership1 extends Membership1 {
private String kind="A类会员卡";
public String getKind() {
return kind;
}
@Override
public double deduct(double x){
return getBalance()-x*0.5;
}
//改变余额的方法
public double lastBalance(double x){
//其实应该把每个成员变量用get来调用,然后在定义的时候每个成员变量都私有化
//this.balance = getBalance()-discount*getDiscount();
setBalance(getBalance()-x*0.5);
return getBalance();
}
}
class BMembership1 extends Membership1 {
private String kind="B类会员卡";
public String getKind() {
return kind;
}
@Override
public double deduct(double x){
return getBalance()-x*0.7;
}
//改变余额的方法
public double lastBalance(double x){
//其实应该把每个成员变量用get来调用,然后在定义的时候每个成员变量都私有化
//this.balance = getBalance()-discount*getDiscount();
setBalance(getBalance()-x*0.7);
return getBalance();
}
}
class CMembership1 extends Membership1 {
private String kind="C类会员卡";
public String getKind() {
return kind;
}
@Override
public double deduct(double x){
return getBalance()-x*0.9;
}
//改变余额的方法
public double lastBalance(double x){
//其实应该把每个成员变量用get来调用,然后在定义的时候每个成员变量都私有化
//this.balance = getBalance()-discount*getDiscount();
setBalance(getBalance()-x*0.9);
return getBalance();
}
}
class Poss {
//余额是卡的属性,所以扣钱功能封装在卡的方法里,这里简易的设计一个“消费金额”,和一个判断卡内余额是否足够支付的方法
private double consume;
public Poss() {
}
//多态实现1
public boolean jud(Membership1 p){
if(p.deduct(consume)>0)
return true;
else {System.out.println("余额不足!"); return false;}
}
public double getConsume() {
return consume;
}
public void setConsume(double consume) {
this.consume = consume;
}
}
class MemTest {
public static void main(String[] args) {
Poss mc = new Poss(); //一台刷卡机
//三种卡,因为构造器不能继承,所以用set初始化每张卡余额
System.out.println("请输入商品价格为:");
Scanner sc = new Scanner(System.in);
//模拟人对刷卡机输入需要扣除的钱
double price = sc.nextDouble();
mc.setConsume(price);
Membership1 vipA = new AMembership1(); vipA.setBalance(2000); useMem(vipA,mc);
Membership1 vipB = new BMembership1(); vipB.setBalance(1000); useMem(vipB,mc);
Membership1 vipC = new CMembership1(); vipC.setBalance(500); useMem(vipC,mc);
}
//多态实现2;懒得写instanceof了
public static void useMem(Membership1 vip,Poss mc){
System.out.println("正在使用:"+ vip.getKind());
if (mc.jud(vip)) { //如果余额足够
System.out.println("购买成功!卡内余额为:"+vip.lastBalance(mc.getConsume()));
}else return;
}
}
- 多态不能调用子类的特殊功能,只能调用父类中原本就有的方法,或子类重写父类的方法。
- 多态即对象的多种形态
- 确保多态中,对象是我想要的那个类new出来的对象,可以用instanceof。
- 继承后子类也不能调用父类的私有化的成员变量,但可以通过get、set方法去调用。
- 一个儿子不能有多个爹,一个爹可以有多个儿子
- 封装:对象代表什么就得封装对应的数据,并提供数据对应的行为。
仅供参考!