练习重载, 举了一个例子, 比如复数的运算, 用工厂模式实现加减乘除
练习工厂模式之前, 先练习一下重载, 实现了复数plu1和plu2的加法运算
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using Microsoft.VisualBasic;
6
7 namespace CSharp_Test
8 {
9 struct plural //定义复数的结构体
10 {
11 public double x, y;
12 public plural(double x, double y) //构造复数方法1
13 {
14 this.x = x;
15 this.y = y;
16 }
17 public plural(plural plu) //构造复数方法2
18 {
19 x = plu.x;
20 y = plu.y;
21 }
22 public override string ToString() //重载ToString()方法
23 {
24 string a = (y>0)? (x + "+" + y + "i"):(x +""+ y + "i");
25 return a;
26 }
27 public static plural operator + (plural lhs, plural rhs)//重载+号运算
28 {
29 plural result = new plural(lhs);
30 result.x += rhs.x;
31 result.y += rhs.y;
32 return result;
33 }
34
35 static void Main()
36 {
37 plural plu1, plu2, plu3; //定义了三个复数
38 plu1 = new plural(1, 1); //复数1赋值
39 plu2 = new plural(2, -3); //复数2赋值
40 plu3 = plu1 + plu2; //复数3 = 复数1 + 复数2
41 Console.WriteLine("plu1 = " + plu1.ToString());
42 Console.WriteLine("plu2 = " + plu2.ToString());
43 Console.WriteLine("plu3 = " + plu3.ToString());
44 }
45 }
46 }
在C#的三目运算符中有一个注意的地方:
在C#中三目运算符不能单独构成语句,这点是和C语言不同的,所以要和三目运算符构成赋值语句, 如果这样写就是错误的:
23 {
24 (y>0)? (return x + "+" + y + "i"):(return x +""+ y + "i"); //错误
25 }
运行结果是:
---------------------------------------------------------------------------------------------------
下面弄了个加减乘除运算的练习, 使用工厂模式(问题随之而来)复数的运算法则如下:
加:(a+bi)+(c+di)=(a+c)+(b+d)i
减:(a+bi)-(c+di)=(a-c)+(b-d)i
乘:(a+bi)•(c+di)=(ac-bd)+(bc+ad)i
除:(a+bi)÷(c+di)=[(ac+bd) / (c^2+d^2)]+[(bc-ad) / (c^2+d^2)] i) //c与d不同时为零且c+di不等于0
使用工厂模式进行的加减乘除运算代码:
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using Microsoft.VisualBasic;
6
7 namespace CSharp_Test
8 {
9 public struct plural //定义复数的结构体
10 {
11 public double x, y;
12 public plural(double x, double y) //构造复数方法1
13 {
14 this.x = x;
15 this.y = y;
16 }
17 public plural(plural plu) //构造复数方法2
18 {
19 x = plu.x;
20 y = plu.y;
21 }
22 public override string ToString() //重载ToString()方法
23 {
24 string result = (y>=0)? (x + "+" + y + "i"):(x +""+ y + "i");
25 return result;
26 }
27 public static plural operator + (plural lhs, plural rhs) //重载+号运算 就在这边出现疑问了(不是错误)
28 {
29 plural result = new plural(lhs);
30 result.x += rhs.x;
31 result.y += rhs.y;
32 return result;
33 }
34 public static plural operator - (plural lhs, plural rhs) //重载-号运算
35 {
36 plural result = new plural(lhs);
37 result.x -= rhs.x;
38 result.y -= rhs.y;
39 return result;
40 }
41 public static plural operator * (plural lhs, plural rhs) //重载*号运算
42 {
43 plural result = new plural(lhs);
44 result.x = lhs.x * rhs.x - lhs.x * rhs.y;
45 result.y = lhs.y * rhs.x + lhs.x * rhs.y;
46 return result;
47 }
48
49 public static plural operator / (plural lhs, plural rhs) //重载/号运算
50 {
51 plural result = new plural(lhs);
52 result.x = (lhs.x * rhs.x + lhs.y * rhs.y) / (rhs.x * rhs.x + rhs.y * rhs.y);
53 result.y = (lhs.y * rhs.x - lhs.x * rhs.y) / (rhs.x * rhs.x + rhs.y * rhs.y);
54 return result;
55 }
56 } //到此结构体定义结束
57
58 public class Operation //在这个类中操作,操作方法进行虚拟
59 {
60 private plural lhs = new plural(0,0);
61 private plural rhs = new plural(0,0);
62 public plural A
63 {
64 get{return lhs;}
65 set{this.lhs = value;}
66 }
67 public plural B
68 {
69 get{return rhs;}
70 set{this.rhs = value;}
71 }
72 public virtual plural GetResult() //操作的方法
73 {
74 plural result = new plural(0, 0);
75 return result;
76 }
77 }
78 public class OperationAdd : Operation //operation类中有个加法操作
79 {
//为什么上面红色标记的部分不能写在这边?????????????
80 public override plural GetResult() //重载操作方法,加法是如何实现
81 {
82 plural result;
83 result = A + B;
84 return result;
85 }
86 }
87 public class OperationSub : Operation //operation类中有个减法操作
88 {
89 public override plural GetResult() //重载操作方法,减法是如何实现
90 {
91 plural result;
92 result = A - B;
93 return result;
94 }
95 }
96 public class OperationMul : Operation //operation类中有个乘法操作
97 {
98 public override plural GetResult() //重载操作方法,乘法是如何实现
99 {
100 plural result;
101 result = A * B;
102 return result;
103 }
104 }
105 public class OpetationDiv : Operation //operation类中有个除法操作
106 {
107 public override plural GetResult() //重载操作方法,除法是如何实现
108 {
109 if ((B.x == 0) && (B.y == 0)) //c与d不同时为零且c+di不等于0
110 throw new Exception("The second plural error!");
111 plural result;
112 result = A / B;
113 return result;
114 }
115 }
116
117
118 public class OperationFactory //简单的操作工厂,判断进行何种运算
119 {
120 public static Operation createOperate(string operate)
121 {
122 Operation oper = null;
123 switch (operate)
124 {
125 case "+":
126 oper = new OperationAdd();
127 break;
128 case "-":
129 oper = new OperationSub();
130 break;
131 case "*":
132 oper = new OperationMul();
133 break;
134 case "/":
135 oper = new OpetationDiv();
136 break;
137 }
138 return oper;
139 }
140 }
141
142 class main
143 {
144 static void Main()
145 {
146 plural C;
147 Operation oper = new Operation();
148 oper = OperationFactory.createOperate("+"); //加法
149 oper.A = new plural(1, 1);
150 oper.B = new plural(2, -4);
151 Console.WriteLine("A = " + oper.A.ToString());
152 Console.WriteLine("B = " + oper.B.ToString());
153 C = oper.GetResult();
154 Console.WriteLine("A+B= " + C.ToString());
155
156 oper = OperationFactory.createOperate("-"); //减法
157 oper.A = new plural(1, 1);
158 oper.B = new plural(2, -4);
159 C = oper.GetResult();
160 Console.WriteLine("A-B= " + C.ToString());
161
162 oper = OperationFactory.createOperate("*"); //乘法
163 oper.A = new plural(1, 1);
164 oper.B = new plural(2, -4);
165 C = oper.GetResult();
166 Console.WriteLine("A*B= " + C.ToString());
167
168 oper = OperationFactory.createOperate("/"); //除法
169 oper.A = new plural(1, 1);
170 oper.B = new plural(2, -4);
171 C = oper.GetResult();
172 Console.WriteLine("A/B= " + C.ToString());
173 Console.ReadLine();
174 }
175 }
176 }
运行结果:
----------------------------------------------------------------------------------------------------
显然在结构体内把所有可能的运算方式都重载一下, 势必提高耦合度! 这样子的工厂模式写法就有些半调子了
但讨论之后发现: 重载结构体的运算符一定要在结构体内完成...