程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 深入繼承之抽象類和接口綜合分析及完整案列解說(二)(5)

深入繼承之抽象類和接口綜合分析及完整案列解說(二)(5)

編輯:關於C語言

實現基類中的抽象方法以及將任務分派到下面的派生類去#region 實現基類中的抽象方法以及將任務分 派到下面的派生類去

/**//// <summary>
/// 實現基類的抽象方法,但是考慮到還需要再下級的派生類來完成
/// 所以我們選擇讓他調用其他能夠被派生類修改的方法
/// </summary>
/// <returns></returns>
public override double GetMoney()
{
return TGetMoney();
}
public override string Execute()
{
return TExecute();
}
/**//// <summary>
/// 在這裡我們並不處理,而是叫給處理他的派生類來完成
/// </summary>
/// <returns></returns>
public virtual double TGetMoney()
{
return 0;
}
/**//// <summary>
/// 在這裡我們並不處理,而是叫給處理他的派生類來完成
/// </summary>
/// <returns></returns>
public virtual string TExecute()
{
return "";
}

#endregion
}
}

篇幅限制,我不做太多的解說,我相信真實案例代碼的展示+你自己學習後的總結會比我解說得更 好。實現的類代碼如下:

實現買書的邏輯↓

namespace EBook
{
/**//// <summary>
/// 這 個類處理會員購買書,我們假設都只是買一本,要買多本的朋友自己想辦法,哈哈
/// </summary>
public class Buy : Sell
{
public Buy(B_Type bt, string un, string bn, double p)
: base(un, bn, p)
{
_btype = bt;
_uname = un;
_bookname = bn;
_price = p;
}

/**//// <summary>
/// 根據書的類型來定折扣 ,當然,這裡的折扣本來是應該從數據庫或者配置文件中取的,我們演示就固化到這裡
/// </summary>
/// <returns></returns>
public override double TGetMoney()
{
switch (_btype)
{
case B_Type.novel:
_cash = _price * 0.5;
break;
case B_Type.life:
_cash = _price * 0.8;
break;
default :
_cash = _price;
break;
}
return _cash;
}
/**//// <summary>
/// 執行插入 數據庫的操作,但是我們這裡不需要,只要把結果顯示出來
/// 所以我們讓他給我們返回一句話就OK了。
/// </summary>
/// <returns></returns>
public override string TExecute()
{
return "尊 敬的會員:" + _uname + ",您購買《" + _bookname + "》,定價為:" + _price + ",折扣後為:" + GetMoney().ToString();
}
}
/**//// <summary>
/// 增加有個處理零售客戶的類,大致邏輯是一樣的,只是 說折扣不同
/// </summary>
public class SBuy : Sell
{
public SBuy(B_Type bt, string un, string bn, double p)
: base(un, bn, p)
{
_btype = bt;
_uname = un;
_bookname = bn;
_price = p;
}

/**//// <summary>
/// 根據書的類型來定折扣,當然,這裡的折扣本來是應該從數據庫或者配置文件中取的,我們演示 就固化到這裡
/// </summary>
/// <returns></returns>
public override double TGetMoney()
{
switch (_btype)
{
case B_Type.novel:
_cash = _price * 0.6;
break;
case B_Type.life:
_cash = _price * 0.9;
break;
default :
_cash = _price;
break;
}
return _cash;
}
/**//// <summary>
/// 執行插入數據庫的操作,但是我們這裡不需要,只要把結果顯示出來
/// 所以我們讓他給我們返 回一句話就OK了。
/// </summary>
/// <returns></returns>
public override string TExecute()
{
return "尊敬的顧客:" + _uname + ",您購買《" + _bookname + "》,定價為:" + _price + ",折扣後為:" + GetMoney().ToString();
}
}
}
實現租書的邏輯↓

namespace EBook
{

/**//// <summary>
/// 租書
/// 分析:租書的時候是不需要支付租金的,但是需要支付押金
/// </summary>
public class Rent : Hire
{
/**//// <summary>
/// 初始化對象
/// </summary>
/// <param name="un">用戶名</param>
/// <param name="bn">書 名</param>
/// <param name="p">書的定價</param>
public Rent(string un, string bn, double p)
{
_uname = un;
_bookname = bn;
_price = p;
}

public override double TGetMoney ()
{//直接返回實際支付的現金
return _cash;
}
/**//// <summary>
/// 將顧客支付的押金寫入數據庫, 這裡我們是打印出來
/// </summary>
/// <returns></returns>
public override string TExecute()
{
return "尊敬的顧客,您租借《" + _bookname + "》,本書定價為:" + _price + "元,請支付押金 " + _price + "元,實際支付" + TGetMoney().ToString() + "元";
}
}
/**//// <summary>
/// 會員還書
/// 分析:還書的時候需要退還押金並支付租金,我們直接把租金在押金裡面硬性扣除
/// 不 同的是這個是會員還書,所以租金和普通顧客的租金有區別
/// </summary>
public class M_Back : Hire
{
/**//// <summary>
/// 初始化對象
/// </summary>
/// <param name="un">用戶名 </param>
/// <param name="bn">書名</param>
/// <param name="day">租賃天 數</param>
/// <param name="bt">書的類型</param>
public M_Back(string un, string bn, int day, B_Type bt)
{
_uname = un;
_bookname = bn;
_day = day;
_btype = bt;
}

public override double TGetMoney()
{//直接返回應找零現金
return _deposit - GetRent();
}
/**//// <summary>
/// 計算書的租金
/// </summary>
/// <returns></returns>
private double GetRent()
{
switch (_btype)
{
case B_Type.novel:
_cash = Convert.ToDouble(_day) * 0.1;
break;
case B_Type.life:
_cash = Convert.ToDouble(_day) * 0.5;
break;
case B_Type.magazine:
_cash = Convert.ToDouble(_day) * 0.1;
break;
}
return _cash;
}
/**//// <summary>
/// 將顧客支付 的押金寫入數據庫,這裡我們是打印出來
/// </summary>
/// <returns></returns>
public override string TExecute()
{
return "尊敬的顧客,您租借《" + _bookname + "》,共計:" + _day + "天,已 支付押金" + _deposit + ",實際產生租金" + GetRent() + "元,應找您" + TGetMoney() + "元 ";
}
}

/**//// <summary>
/// 普通顧客還書
/// 分析:還書的時候需要退還押金並支付租金 ,我們直接把租金在押金裡面硬性扣除
/// </summary>
public class S_Back : Hire
{
/**//// <summary>
/// 初始化對象
/// </summary>
/// <param name="un">用戶名 </param>
/// <param name="bn">書名</param>
/// <param name="day">租賃天 數</param>
/// <param name="bt">書的類型</param>
public S_Back(string un, string bn, int day, B_Type bt)
{
_uname = un;
_bookname = bn;
_day = day;
_btype = bt;
}
/**//// <summary>
/// 直接應該退給顧客多少錢
/// </summary>
/// <returns></returns>
public override double TGetMoney()
{//直接返回應該找零的現金,已交的押金減去實際的租金
return _deposit - GetRent ();
}
/**//// <summary>
/// 計算書的租金
/// </summary>
/// <returns></returns>
private double GetRent()
{
switch (_btype)
{
case B_Type.novel:
_cash = Convert.ToDouble(_day) * 0.5;
break;
case B_Type.life:
_cash = Convert.ToDouble(_day) * 1d;
break;
case B_Type.magazine:
_cash = Convert.ToDouble(_day) * 0.3;
break;
}
return _cash;
}
/**//// <summary>
/// 將顧客支付的押金寫入數據庫,這裡我們是打印出來
/// </summary>
/// <returns></returns>
public override string TExecute()
{
return "尊敬的顧客,您租借《" + _bookname + "》,共計:" + _day + "天,已支付押金" + _deposit + ",實際產生租金" + GetRent() + "元,應找您" + TGetMoney() + "元";
}
}
}
定義工廠類,處理按照會員類型返回具體的類

using EBook;
/**//// <summary>
/// 工廠類主要是按照會員類型將具體使用那個類返回出去
/// </summary>
public class Factory
{
private U_Type _utype;  //會員類型
private B_Type _btype;  // 書的類型
private S_Type _stype;  //交易類型
private H_Type _htype;  //是租書還是還書
private string _bookname; //書名
private string _uname;  //用戶名
private double _price;  //書的定價
private int _day;      //租借的天數

public Factory(U_Type ut,B_Type bt,S_Type st, string bn,string un,double p)
{
_utype = ut;
_btype = bt;
_stype = st;
_bookname = bn;
_uname = un;
_price = p;
}
/**//// <summary>
/// 因為這個並不參與到最初的類實例化中去
/// 比如是買書,那根本談不上是租還是還,所以單獨列出來
/// </summary>
public H_Type Htype
{
get { return _htype; }
set { _htype = value; }
}
public int Day
{
get { return _day; }
set { _day = value; }
}
/**//// <summary>
/// 根 據交易類型來判斷給那一個方法處理
/// </summary>
/// <returns></returns>
public Root HorS()
{
if(_stype==S_Type.hire)
return GetHire();
else
return GetBuy();
}
/**//// <summary>
/// 根據會員的類型來判斷返回那一個被初始化的類
/// </summary>
/// <returns></returns>
private Sell GetBuy()
{
if(_utype==U_Type.member)
return new Buy(_btype, _uname, _bookname, _price);
else
return new SBuy(_btype, _uname, _bookname, _price);

}
/**//// <summary>
/// 根據是租書還是還書(又判斷顧客類型)來初始化對應的類
/// </summary>
/// <returns></returns>
private Hire GetHire()
{
if (_htype == H_Type.rent)
return new Rent (_uname, _bookname, _price);
else
{
if (_utype == U_Type.member)
return new M_Back(_uname, _bookname, _day, _btype);
else
return new S_Back(_uname, _bookname, _day, _btype);

}
}
}

到 這裡為止,我們這個書店的程序邏輯就設計完畢了。

篇幅限制,具體的調用我就不多做解說,歡迎大家一起探討,學習。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved