Implement ICloneable, IComparable : IComparable « Class Interface « C# / C Sharp






Implement ICloneable, IComparable

 

using System;
using System.Runtime.Serialization;
using System.Collections;


public class ComplexOverflowException : ApplicationException {
    public ComplexOverflowException() :
        base() {
    }
    public ComplexOverflowException(string msg) :
        base(msg) {
    }
    public ComplexOverflowException(SerializationInfo info, StreamingContext cxt) :
        base(info, cxt) {
    }
    public ComplexOverflowException(string msg, Exception inner) :
        base(msg, inner) {
    }
}

public class Complex : ICloneable, IComparable {
    private double realPart = 0.0;
    private double imagPart = 0.0;

    public Complex() {
    }

    public Complex(double r) : this(r, 0) {
    }

    public Complex(double r, double i) {
        realPart = r;
        imagPart = i;
    }

    public Complex(Complex l) {
        realPart = l.realPart;
        imagPart = l.imagPart;
    }

    public double Imaginary {
        get {
            return imagPart;
        }
        set {
            imagPart = value;
        }
    }

    public double Real {
        get {
            return realPart;
        }
        set {
            realPart = value;
        }
    }

    public void Scale(double val) {
        double tempImaginary = val * imagPart;
        realPart *= val;
        imagPart = tempImaginary;
    }

    static public Complex operator +(Complex l, Complex r) {
        Complex result = new Complex(l);
        result.realPart += r.realPart;
        result.imagPart += r.imagPart;
        return result;
    }

    static public Complex operator *(Complex l, Complex r) {
        Complex result = new Complex();
        checked {
            result.Real = l.Real * r.Real - l.Imaginary * r.Imaginary;
            result.Imaginary = l.Real * r.Imaginary + l.Imaginary * r.Real;
        }
        return result;
    }

    static public bool operator ==(Complex l, Complex r) {
        return ((l.Real == r.Real) &&
            (l.Imaginary == r.Imaginary));
    }

    static public bool operator !=(Complex l, Complex r) {
        return !(l == r);
    }

    static public bool operator >(Complex l, Complex r) {
        double normL = l.imagPart * l.imagPart + l.realPart * l.realPart;
        double normR = r.imagPart * r.imagPart + r.realPart * r.realPart;
        return normL > normR;
    }

    static public bool operator <(Complex l, Complex r) {
        return r > l;
    }

    public override bool Equals(object o) {
        if (!(o is Complex))
            return false;
        Complex c = (Complex)o;
        return ((c.Real == Real) && (c.Imaginary == Imaginary));
    }
    public override int GetHashCode() {
        return (int)(Real + Imaginary);
    }
    object ICloneable.Clone() {
        return new Complex(this);
    }
    int IComparable.CompareTo(object o) {
        if (!(o is Complex))
            throw new ArgumentException("Object is not a complex number");
        Complex c = (Complex)o;
        double norm = imagPart * imagPart + realPart * realPart;
        double normO = c.imagPart * c.imagPart + c.realPart * c.realPart;
        if (norm > normO)
            return 1;
        else if (normO > norm)
            return -1;
        else
            return 0;
    }
}

class MainClass {

    public static IComparable theMax(IComparable seed, IEnumerable coll) {
        foreach (IComparable c in coll) {
            if (c.CompareTo(seed) > 0) {
                seed = c;
            }
        }
        return seed;
    }

    static void Main(string[] args) {
        Complex[] cArray = new Complex[100];

        Complex max = new Complex(0, 0);
        max = (Complex)theMax(max, cArray);
    }
}

 








Related examples in the same category

1.Implements IComparable