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 }

    运行结果:

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

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

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

  • 相关阅读:
    HDOJ 4747 Mex
    HDU 1203 I NEED A OFFER!
    HDU 2616 Kill the monster
    HDU 3496 Watch The Movie
    Codeforces 347A A. Difference Row
    Codeforces 347B B. Fixed Points
    Codeforces 372B B. Hungry Sequence
    HDU 1476 Sudoku Killer
    HDU 1987 How many ways
    HDU 2564 词组缩写
  • 原文地址:https://www.cnblogs.com/technology/p/1709682.html
Copyright © 2011-2022 走看看