代码改变世界

继前一篇代码通过向上转型实现多态

2013-03-27 11:26  Chan08  阅读(160)  评论(0编辑  收藏  举报
  1 static class Program
  2 {
  3 /// <summary>
  4 /// 应用程序的主入口点。
  5 /// </summary>
  6 [STAThread]
  7 static void Main()
  8 {
  9 OptertorAdd op = new OptertorAdd();
 10 op.GetResult(1, 2);
 11 }
 12 }
 13 
 14 /// <summary>
 15 /// 父类 Created:ChenHu date:2013326
 16 /// </summary>
 17 public class Opreator
 18 {
 19 //不想暴漏在外的私有变量可以用属性封装起来
 20 private double _numA;
 21 private double _numB;
 22 
 23 public double NumA
 24 {
 25 get { return _numA; }
 26 set { _numA = value; }
 27 }
 28 
 29 public double NumB
 30 {
 31 get { return _numB; }
 32 set { _numB = value; }
 33 }
 34 
 35 public virtual double GetResult(int a, int b)
 36 {
 37 double result = 0;
 38 //------------------------------------------
 39 //TODO:可以处理需要影藏的逻辑,这也是new或则说虚方法隐藏的逻辑的一种手段,隐藏的逻辑可以是员工的薪资计算等保密操作
 40 //------------------------------------------
 41 result = _numA + _numB;
 42 return result;
 43 }
 44 }
 45 
 46 /// <summary>
 47 /// 派生类 Created:ChenHu date:2013326
 48 /// </summary>
 49 class OptertorAdd : Opreator
 50 {
 51 public override double GetResult(int a, int b)
 52 {
 53 //这里base的逻辑可以放在自己逻辑之前也可以放在自己逻辑的后面
 54 //这里的位置其实很有讲究哦,逻辑不对可能会引起报错。
 55 //如把base逻辑放在自己逻辑之前,在父类中 _numA + _numB=0;因为你还没赋值
 56 base.GetResult(a, b);
 57 NumA = a;
 58 NumB = b;
 59 double result = 0;
 60 result = NumA + NumB;
 61 //父类逻辑在此位置 _numA + _numB=3;
 62 //base.GetResult(a, b); 
 63 return result;
 64 
 65 }
 66 }
 67 
 68 
 69 /// <summary>
 70 ///首先创建一个工厂,这里我们通过向上转型实现多态
 71 ///这里我们试用静态字段的原因就是:
 72 ///这个类可能调用的次数很大,我们最好让其闲在内存加载好
 73 /// </summary>
 74 /// <remarks>
 75 /// 可以这样理解多态:一个卖猪肉的爹生了好几个儿子(儿子都具有爹的基因此为继承),
 76 /// 每个儿子的工作都不一样,有卖西瓜的卖土豆的,这个时候,
 77 /// 如果爹想吃西瓜了就会找到卖西瓜的儿子要,如果想吃土豆也是一样的。如果想吃猪肉,
 78 /// 但是没有卖肉的儿子怎么办呢? 呵呵 生一个卖猪肉的儿子就行了,虽然有点夸张,但是这是多态的本质。
 79 /// </remarks>
 80 public static class OptetaionFactory
 81 {
 82 /// <summary>
 83 /// Frank 2013327
 84 /// </summary>
 85 /// <param name="oper">计算符号,根据不同的符号返回不同的计算类实体</param>
 86 /// <returns>计算类</returns>
 87 public static Opreator OptertCreate(String oper)
 88 {
 89 Opreator opretaor = null;
 90 switch (oper)
 91 {
 92 case "+":
 93 //向上转型:子类->父类
 94 opretaor = new OptertorAdd();
 95 break;
 96 //TODO:这里可以根据需要然后从父类派生出更多的子类实例:这就是多态了
 97 }
 98 return opretaor;
 99 }
100 }