博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#重载运算符, 工厂模式
阅读量:6682 次
发布时间:2019-06-25

本文共 6356 字,大约阅读时间需要 21 分钟。

  练习重载, 举了一个例子, 比如复数的运算, 用工厂模式实现加减乘除

  练习工厂模式之前, 先练习一下重载, 实现了复数plu1和plu2的加法运算

 
1
  
using
 System;
 
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#的三目运算符中有一个注意的地方:

24
             
string
 a 
=
 (y
>
0
)
?
 (x 
+
 
"
+
"
 
+
 y 
+
 
"
i
"
):(x 
+
""
+
 y 
+
 
"
i
"
);

  在C#中三目运算符不能单独构成语句,这点是和C语言不同的,所以要和三目运算符构成赋值语句, 如果这样写就是错误的:

22
         
public
 
override
 
string
 ToString()       
//
重载ToString()方法
23
         {
24
             
(y
>
0
)
?
 (
return
 x 
+
 
"
+
"
 
+
 y 
+
 
"
i
"
):(
return
 x 
+
""
+
 y 
+
 
"
i
"
);   //错误
25
         }

运行结果是:

%E5%A4%8D%E6%95%B0%E8%BF%90%E7%AE%97%E7%BB%93%E6%9E%9C.png

---------------------------------------------------------------------------------------------------

下面弄了个加减乘除运算的练习, 使用工厂模式(问题随之而来)复数的运算法则如下:

  加:(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

使用工厂模式进行的加减乘除运算代码:

  
1
 
using
 System;
  
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
 }

运行结果:

%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F%E7%BB%93%E6%9E%9C.png

----------------------------------------------------------------------------------------------------

显然在结构体内把所有可能的运算方式都重载一下, 势必提高耦合度! 这样子的工厂模式写法就有些半调子了

但讨论之后发现: 重载结构体的运算符一定要在结构体内完成...

转载地址:http://lmxao.baihongyu.com/

你可能感兴趣的文章
mysql查询语句
查看>>
CentOs 配置网易163yum 步骤
查看>>
mysql myisam与innodba的区别
查看>>
android 5.0 顶部bar问题
查看>>
Android混合开发之WebViewJavascriptBridge实现JS与java安全交互
查看>>
思维导图软件MindManager实用功能TOP 10 (一)
查看>>
JavaScript中this详解
查看>>
CentOS 6 基本配置
查看>>
oneinstack/LNMP 增加ngx_pagespeed webp 及 postgresql支持
查看>>
M3U8的MIME类型
查看>>
php如何实现websocket
查看>>
深入理解java异常处理机制
查看>>
日常学习流水账
查看>>
Java Applet 问题汇总
查看>>
android.intent.action
查看>>
使用HttpURLConnection向服务器发送get请求
查看>>
Linux查看程序端口占用情况
查看>>
outlook2007无法打开—提示“无效的XML 无法加载此视图”
查看>>
ssh乱码(在控制台正常输出,数据库中乱码)
查看>>
flex库项目用default.css定义默认样式
查看>>