通过深入继承之抽象类和接口综合分析及完整案列解说(一),我想大家已经认识到了知识共享的巨大力量了。我门上面看到的这些东西不是我们任何一个人在短时间内就能够总结出来的,但是大家一起总结,那结果就是这样爽的。
我希望大家都能够大方一点,别做得那么小气,生怕自己知道的那点知识被别人知道了。饭碗就被别人抢了,事实上在跟人分享的过程中并不是一味的在付出,你同样也会有收获,无论是帮别人解答疑问还是跟别人交流,就好象我在写(或着说我是在复制别人的心得)一样,看起来我是在无偿的为大家做,事实上呢我同样的有收获的,因为写这个文章的时候我发现了很多我过去学和用中一之没有注意到的死角,也发现很多更新,更好的技巧。
所以我相信,只要我门每个人都尽量的多跟人分享你所学,最终带来的是大家的共同进步。在园里我特别喜欢老赵(MSDN Web Cast的ASP.NET AJAX深入浅出系列课程),Dflying Chen(AJAX系列书籍),张逸老师(软件设计精要与模式,WCF),李会军(新版设计模式)等同志,他门的书籍及文章我相信大家看后都会受益非浅,他们在园里的排名及贡献是大家共同看到的。
也许大家发现了我上面给张逸叫老师,这是为什么呢?上面列举的这些牛人中我就认识张逸,认识我的朋友可别说是我和他同姓才特别介绍,其实并不是这样。在我的学习过程中张逸老师对我帮助很大,在我大学即将毕业的最后一年里,我在张老师所在的公司实习(他当时是我门.NET开发一部的部长,管人可严了,我悄悄说的,大家看到了这句话一定是眼花了,呵呵),他曾经给我上很多课程和开过很多技术专题讲座,我想大家都知道,对于一个没毕业的大学生来说,没有一定的项目开发经验在写论文的时候是很吃力的,在我考系统分析师期间论文得到他的指导让我考试顺利通过,在此我借园子的位置想张老师说声谢谢。另外他所著的《软件设计精要与模式》对我的帮助也很大,虽然这不是一本讲解设计模式的专题书籍,他的写作却是以设计模式为主来讲解的,最后以MS开源项目PetShop 4.0作为案例讲解模式的应用,个人觉得写得很不错,我在现在的项目中都采用了书里的很多设计思想。
看到这里大家是不是觉得我这个人很罗嗦了,写文章写到去介绍牛人和书籍去了,这是不是在为他门打广告????
好了,言归正转,我门还是进入主题,戏不能唱一半就停止了吧,既然开始了那么演得在差也得演唱完毕吧。看看下面这个实例:
我门根据一个小书店的情况来说这个实例,当然实例不能准确的说明一切,只是说通过这个类让大家更感性的认识到抽象类和接口的使用情况。
首先分析书店的经营情况
1. 书是可以出祖和销售的
2. 书的分类为三个方面,所以销售和出祖的价格分别也分三个档次
3. 顾客分为会员和普通顾客
通过上面的分析,我们可以开始构思程序的实现了
1. 无论买那种折扣的书都需要支付书对应的现金购买
2. 无论租那种书都需要支付对应的租金
3. 无论那种业务类型都需要返回出详细信息(实际上应该是写入数据库)
4. 无论他的逻辑是怎么样的,我们在前台处理的时候并不想也不需要知道那么多,我们就希望用我们现在知道的信息直
接换取到应该的操作.
这两个我们使用接口来定义返回的 钱 .
然后再定义一个接口方法来处理我们的写入数据库操作(这里是返回出详细信息)
接下来把顾客类型,交易类型,书的类型以及租借类型(指是租书还是还书)分别做个枚举
先来看一个UML图,我相信比我用手敲键盘更容易说清楚结构。

一. 定义枚举及Money接口
1
namespace EBook
2

{
3
/**//// <summary>
4
/// 会员类型
5
/// </summary>
6
public enum U_Type
7
{
8
member, //会员
9
shopper, //零售\租顾客
10
}
11
/**//// <summary>
12
/// 书的类型
13
/// </summary>
14
public enum B_Type
15
{
16
novel, //小说
17
life, //生活类
18
magazine //杂志
19
}
20
/**//// <summary>
21
/// 交易类型
22
/// </summary>
23
public enum S_Type
24
{
25
sell, //出售
26
hire //出租
27
}
28
/**//// <summary>
29
/// 租借类型,租借,归还
30
/// </summary>
31
public enum H_Type
32
{
33
rent,
34
back
35
}
36
/**//// <summary>
37
/// 定义一个接口,返回本次交易的钱
38
/// 执行最后插入数据库的操作
39
/// </summary>
40
public interface Money
41
{
42
double GetMoney();
43
string Execute();
44
}
45
}
二. 实现借口,抽象出具体的逻辑方法,定义枚举及内部成员
namespace EBook


{

/**//// <summary>
/// 实现接口中返回钱的方法,并且定义一系列下面类都会用到的成员
/// 做为接口下的一个总承
/// </summary>
public abstract class Root : Money

{
protected U_Type _utype; //会员类型
protected B_Type _btype; //书的类型
protected S_Type _stype; //交易类型
protected string _bookname; //书名
protected string _uname; //用户名
protected double _price; //书的定价
protected double _cash; //实际支付的现金,不管是租书还是还书还是买书,他都会涉及到最终给了多少钱这个问题

public abstract double GetMoney();
public abstract string Execute();
}

/**//// <summary>
/// 作为销售类的一个基类,这个类实际上并没有做什么工作,主要是针对接口和基类做了一些补充说明
/// </summary>
public abstract class Sell : Root

{

/**//// <summary>
/// 初始化该类
/// </summary>
/// <param name="un">用户名</param>
/// <param name="bn">书名</param>
/// <param name="p">书的定价</param>
public Sell(string un, string bn, double p)

{
_uname = un;
_bookname = bn;
_price = p;
}


外露属性(定价,书名,用户名)#region 外露属性(定价,书名,用户名)

/**//// <summary>
/// 获取书的定价
/// </summary>
public double Price

{

get
{ return _price; }
}

/**//// <summary>
/// 获取用户名称
/// </summary>
public string Uname

{

get
{ return _uname; }
}

/**//// <summary>
/// 获取书的名称
/// </summary>
public string Bname

{

get
{ return _bookname; }
}
#endregion


实现基类中的抽象方法以及将任务分派到下面的派生类去#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
}


/**//// <summary>
/// 作为租赁业务的一个基类,帮助实现ROOT类并增加租赁相关的属性和方法。
/// </summary>
public abstract class Hire : Root

{

系列的私有字段#region 系列的私有字段


/**//// <summary>
/// 租赁天数
/// </summary>
protected int _day;

/**//// <summary>
/// 书的押金
/// </summary>
protected double _deposit;

#endregion


![]()