zoukankan      html  css  js  c++  java
  • C#重载运算符, 工厂模式

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

      练习工厂模式之前, 先练习一下重载, 实现了复数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(11);    //复数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         }

    运行结果是:

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

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

      加:(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(00);
     
    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(11);
    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(11);
    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(11);
    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(11);
    170             oper.B = new plural(2-4);
    171             C = oper.GetResult();
    172             Console.WriteLine("A/B= " + C.ToString());
    173             Console.ReadLine();
    174         }
    175     }
    176 }

    运行结果:

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

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

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

  • 相关阅读:
    JavaScript instanceof vs typeof
    2016让我受益最大的那些书--别找了,都在这里
    我为什么要自己编译openjdk8以及那些坑
    支撑Java NIO 与 NodeJS的底层技术
    Java I/O and NIO [reproduced]
    How do servlets work-Instantiation, sessions, shared variables and multithreading[reproduced]
    怎样当一个企业舍不得的人
    【Android】Android apk默认安装位置设置
    【Android】Android 代码判断是否获取ROOT权限(一)
    【Android】Android 广播大全
  • 原文地址:https://www.cnblogs.com/technology/p/1709682.html
Copyright © 2011-2022 走看看