zoukankan      html  css  js  c++  java
  • 运算符重载,以及迭代器[foreach]示例

     以下代码来源于"c#高级编程(第4版)",只不过我对它做了一些注释和修改
    using System;
    using System.Collections;
    using System.Text;


    namespace Wrox.ProCSharp.VectorAsCollection
    {
        
    class MainEntryPoint
        
    {
            
    static void Main(string[] args)
            
    {
                Vector Vect1 
    = new Vector(1.02.05.0);

                Console.WriteLine(Vect1.ToString());
                Console.WriteLine(Vect1.ToString(
    "IJK",null));
                Console.WriteLine(Vect1.ToString(
    "VE"null));

                Vector Vect2 
    = new Vector(1.02.03.0);
                Console.WriteLine(Vect1 
    == Vect2);

                Double t 
    = Vect1 * Vect2;
                Console.WriteLine(t);


                
    foreach (double p in Vect1)
                
    {
                    Console.WriteLine(p);
                }

                Console.ReadLine();
            }

        }


        
    /// <summary>
        
    /// 声明一个矢量类(包含基本的x,y,z三个分量)
        
    /// </summary>

        struct Vector : IFormattable
        
    {
            
    public double x, y, z;       

            
    public Vector(double x, double y, double z)
            
    {
                
    this.x = x;
                
    this.y = y;
                
    this.z = z;
            }


            

            
    /// <summary>
            
    /// 构造函数
            
    /// </summary>
            
    /// <param name="rhs"></param>

            public Vector(Vector rhs)
            
    {
                x 
    = rhs.x;
                y 
    = rhs.y;
                z 
    = rhs.z;
            }


            
    /// <summary>
            
    /// 重载object类的ToString()方法
            
    /// </summary>
            
    /// <returns></returns>

            public override string ToString()
            
    {
                
    return "" + x + " , " + y + " , " + z + " )";
            }



            
    /// <summary>
            
    /// 实现IFromattable接口,扩展自己的ToString()方法
            
    /// </summary>
            
    /// <param name="format"></param>
            
    /// <param name="formatProvider"></param>
            
    /// <returns></returns>

            public string ToString(string format, IFormatProvider formatProvider)
            
    {
                
    if (format == null)
                    
    return ToString();
                
    string formatUpper = format.ToUpper();
                
    switch (formatUpper)
                
    {
                    
    case "N":
                        
    return "|| " + Norm().ToString() + " ||";
                    
    case "VE":
                        
    return String.Format("( {0:E}, {1:E}, {2:E} )", x, y, z);
                    
    case "IJK":
                        StringBuilder sb 
    = new StringBuilder(x.ToString(), 30);
                        sb.Append(
    " i + ");
                        sb.Append(y.ToString());
                        sb.Append(
    " j + ");
                        sb.Append(z.ToString());
                        sb.Append(
    " k");
                        
    return sb.ToString();
                    
    default:
                        
    return ToString();
                }

            }


            
    /// <summary>
            
    /// 索引器
            
    /// </summary>
            
    /// <param name="i"></param>
            
    /// <returns></returns>

            public double this[uint i]
            
    {
                
    get
                
    {
                    
    switch (i)
                    
    {
                        
    case 0:
                            
    return x;
                        
    case 1:
                            
    return y;
                        
    case 2:
                            
    return z;
                        
    default:
                            
    throw new IndexOutOfRangeException(
                               
    "Attempt to retrieve Vector element" + i);
                    }

                }

                
    set
                
    {
                    
    switch (i)
                    
    {
                        
    case 0:
                            x 
    = value;
                            
    break;
                        
    case 1:
                            y 
    = value;
                            
    break;
                        
    case 2:
                            z 
    = value;
                            
    break;
                        
    default:
                            
    throw new IndexOutOfRangeException(
                               
    "Attempt to set Vector element" + i);
                    }

                }

            }


            
    /*  
             * 考虑到精度问题,暂不用下面的写法来实现==运算符的重载
             * public static bool operator == (Vector lhs, Vector rhs)
                     {
                        if (lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z)
                           return true;
                        else
                           return false;
                     }
    */


            
    private const double Epsilon = 0.0000001;
            

            
    /// <summary>
            
    /// 重载==运算符
            
    /// </summary>
            
    /// <param name="lhs"></param>
            
    /// <param name="rhs"></param>
            
    /// <returns></returns>

            public static bool operator ==(Vector lhs, Vector rhs)
            
    {
                
    if (System.Math.Abs(lhs.x - rhs.x) < Epsilon &&
                   System.Math.Abs(lhs.y 
    - rhs.y) < Epsilon &&
                   System.Math.Abs(lhs.z 
    - rhs.z) < Epsilon)
                    
    return true;
                
    else
                    
    return false;
            }


            
    /// <summary>
            
    /// 重载!=运算符
            
    /// </summary>
            
    /// <param name="lhs"></param>
            
    /// <param name="rhs"></param>
            
    /// <returns></returns>

            public static bool operator !=(Vector lhs, Vector rhs)
            
    {
                
    return !(lhs == rhs);
            }



            
    /// <summary>
            
    /// 重载+运算符
            
    /// </summary>
            
    /// <param name="lhs"></param>
            
    /// <param name="rhs"></param>
            
    /// <returns></returns>

            public static Vector operator +(Vector lhs, Vector rhs)
            
    {
                Vector Result 
    = new Vector(lhs);
                Result.x 
    += rhs.x;
                Result.y 
    += rhs.y;
                Result.z 
    += rhs.z;
                
    return Result;
            }


            
    /// <summary>
            
    /// 重载*运算符
            
    /// </summary>
            
    /// <param name="lhs"></param>
            
    /// <param name="rhs"></param>
            
    /// <returns></returns>

            public static Vector operator *(double lhs, Vector rhs)
            
    {
                
    return new Vector(lhs * rhs.x, lhs * rhs.y, lhs * rhs.z);
            }


            
    /// <summary>
            
    /// 重载*运算符
            
    /// </summary>
            
    /// <param name="lhs"></param>
            
    /// <param name="rhs"></param>
            
    /// <returns></returns>

            public static Vector operator *(Vector lhs, double rhs)
            
    {
                
    return rhs * lhs;
            }


            
    /// <summary>
            
    /// 重载*运算符
            
    /// </summary>
            
    /// <param name="lhs"></param>
            
    /// <param name="rhs"></param>
            
    /// <returns></returns>

            public static double operator *(Vector lhs, Vector rhs)
            
    {
                
    return lhs.x * rhs.x + lhs.y + rhs.y + lhs.z * rhs.z;
            }


            
    /// <summary>
            
    /// 重载GetHashCode(不重载的话,也可编译通过,但编译时会有一个警告)
            
    /// </summary>
            
    /// <returns></returns>

            public override int GetHashCode()
            
    {
                    
    return base.GetHashCode();
            }


            
    /// <summary>
            
    /// 重载Equals(不重载的话,也可编译通过,但编译时会有一个警告)
            
    /// </summary>
            
    /// <param name="obj"></param>
            
    /// <returns></returns>

            public override bool Equals(object obj)
            
    {
                    
    return base.Equals(obj);
            }


            
    /// <summary>
            
    /// 返回x,y,z的平方和
            
    /// </summary>
            
    /// <returns></returns>

            public double Norm()
            
    {
                
    return x * x + y * y + z * z;
            }


            
    enumerator class
        }

    }
    运行结果:
    ( 1 , 2 , 5 )
    1 i + 2 j + 5 k
    ( 1.000000E+000, 2.000000E+000, 5.000000E+000 )
    False
    20
    1
    2
    5
    作者:菩提树下的杨过
    出处:http://yjmyzz.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    linux目录跳转的好武器z.sh
    找工作的程序员必懂的Linux
    11-面向对象4
    10-面向对象3
    09-面向对象2
    08-面向对象1
    06-数组
    3.5-乘法运算器设计
    3.2-定点数补码加减运算器设计
    4.12-虚拟存储器
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/996979.html
Copyright © 2011-2022 走看看