Search code examples
c#sortinginheritancecomparetoicomparable

containing type does not implement interface 'System.IComparable' error


namespace Theprogram.cs
{
    class Program
    {
        static void Main(string[] args)
        {
            CreditCustomer[] creditCustomer = new CreditCustomer[5];
            int x, y;
            bool goodNum;
            for (x = 0; x < creditCustomer.Length; ++x)
            {
                creditCustomer[x] = new CreditCustomer();
                Console.Write("Enter customer number ");
                creditCustomer[x].CustomerNumber = Convert.ToInt32(Console.ReadLine());
                goodNum = true;
                for (y = 0; y < x; ++y)
                {
                    if (creditCustomer[x].Equals(creditCustomer[y]))
                        goodNum = false;
                }
                while (!goodNum)
                {
                    Console.Write("Sorry, the customer number " +
                       creditCustomer[x].CustomerNumber + " is a duplicate. " +
                       "\nPlease reenter ");
                    creditCustomer[x].CustomerNumber = Convert.ToInt32(Console.ReadLine());
                    goodNum = true;
                    for (y = 0; y < x; ++y)
                    {
                        if (creditCustomer[x].Equals(creditCustomer[y]))
                            goodNum = false;
                    }
                }
                Console.Write("Enter name ");
                creditCustomer[x].CustomerName = Console.ReadLine();
                Console.Write("Enter age ");
                creditCustomer[x].Rate = Convert.ToInt32(Console.ReadLine());
                Console.Write("Enter amount due ");
                creditCustomer[x].AmountDue = Convert.ToDouble(Console.ReadLine());
            }
            Array.Sort(creditCustomer);
            Array.Sort(customer);
        }
    }
    class Customer : IComparable<Customer>
    {
        private int customerNumber;
        public int CustomerNumber
        {
            get
            {
                return customerNumber;
            }
            set
            {
                customerNumber = value;
            }
        }
        private string customerName;
        public string CustomerName
        {
            get
            {
                return customerName;
            }
            set
            {
                customerName = value;
            }
        }
        private double amountDue;
        public double AmountDue
        {
            get
            {
                return amountDue;
            }
            set
            {
                amountDue = value;
            }
        }
        public Customer(int num, string name, int amt)
        {
        CustomerNumber = num;
        CustomerName = name;
        AmountDue = amt;
        }
        public Customer(): this(9, "ZZZ", 0)
        {
        }
        public override bool Equals(Object e)
        {
            bool equal;
            Customer temp = (Customer)e;
            if (this.CustomerNumber == temp.CustomerNumber)
                equal = true;
            else
                equal = false;
            return equal;
        }
        public override int GetHashCode()
        {
            return CustomerNumber;
        }
        public override string ToString()
        {
            return (GetType() + " Credit Customer " + CustomerNumber + " " + CustomerName +
              " Amount Due is " + AmountDue.ToString("C") + " Interest rate is ");
        }
        protected virtual int IComparable.CompareTo(Object o)
        {
            int returnVal;
            Customer temp = (Customer)o;
            if (this.CustomerNumber >
                temp.CustomerNumber)
                returnVal = 1;
            else
                if (this.CustomerNumber < temp.CustomerNumber)
                    returnVal = -1;
                else
                    returnVal = 0;
            return returnVal;
        }
    }
    class CreditCustomer : Customer, IComparable<CreditCustomer>
    {
        public int Rate {get; set;}
        int MonthlyPayment { get; set; }
        public CreditCustomer(int customerNumber, string customerName, int amountDue, int Rate) : base(customerNumber, customerName, amountDue)
        { }
        public CreditCustomer(): this(0, "", 0, 0)
        { }
        public override string ToString()
        {
            return (GetType() + " Credit Customer " + CustomerNumber + " " + CustomerName +
              " Amount Due is " + AmountDue.ToString("C") + " Interest rate is " + Rate + " Monthly Payment is " + MonthlyPayment);
        }
        int IComparable.CompareTo(object o)
        {
            int returnVal;
            CreditCustomer temp = (CreditCustomer)o;
            if (this.CustomerNumber > temp.CustomerNumber)
                returnVal = 1;
            else
                if (this.CustomerNumber < temp.CustomerNumber)
                    returnVal = -1;
                else
                    returnVal = 0;
            return returnVal;
        }
    }

}

I am having trouble implementing Icomparable in C# for my parent and child classes as I get the error: does not implement interface member'System.IComparable.CompareTo

I really need help on how to implement the Icomparable interface so that I can use the compareTo method on my array of object. Any help would be greatly appreciated.


Solution

  • If you're using Visual Studio and are not sure how to implement an interface, just right click IComparable in the class declaration

    class CreditCustomer : Customer, IComparable<CreditCustomer>
    

    and select Implement Interface and any of the two options.

    The correct signature for the implementation in CreditCustomer would be either:

    public int CompareTo(CreditCustomer other)
    {
    }
    

    or

    int IComparable<CreditCustomer>.CompareTo(CreditCustomer other)
    {
    }
    

    Note that the second signature would hide the method unless you cast the object to IComparable<CreditCustomer>.