Перегрузка методов и операций в классах

Автор работы: Пользователь скрыл имя, 30 Марта 2013 в 14:08, лекция

Краткое описание

При определении методов какого-нибудь класса в программах необходимо указать тип возвращаемого методом значения, а также количество параметров и тип каждого из них.
Например, программистом была разработана функция с именем sum(), которая суммировала два целых значения. Если требуется использовать подобную функцию для сложения трех целых значений, следует создать функцию с другим именем. Аналогично если требуется использовать подобную функцию для сложения значений типа float, то необходимо еще одна функция с еще одним именем.

Прикрепленные файлы: 1 файл

Лекция 18. Перегрузка операций.doc

— 114.00 Кб (Скачать документ)

            // В данном случаи монстр X и монстр Y не равны так как занимают в памяти разные адреса.Монстры X и Z будут равны.

            if (X.Equals(Y)) Console.WriteLine("X эквивалентно Y"); //Монстры эквиваленты, так как имеют одинаковые значения полей

            else Console.WriteLine("X не эквивалентно Y");

            Console.WriteLine(X.GetType()); // Возвращается тип для экземпляра класса X. Возвратиться тип переменной X - ConsoleApplecation.Monster.

            Console.ReadKey();

        }

    }

}


 

 

 

Перегрузку операций можно осуществить также с помощью стандартного интерфейса IComparable.

Если класс реализует интерфейс IComparable, его экземпляры можно сравнивать между собой по принципу больше или меньше. Можно использовать для этого операции отношения, перегрузив их. Операции должны перегружаться парами. Перегрузка операций обычно выполняется путем делегирования, то есть обращения к переопределенным методам CompareTo() и Equals().

Если класс реализует интерфейс IComparable, требуется переопределить метод Equals() и связанный с ним метод GetHashCode(). Оба метода унаследованы от базового класса object.


Рассмотрим предыдущий пример перегрузки операций отношений для класса Monster с использованием стандартного интерфейса IComparable.

В качестве критерия сравнения объектов по принципу больше или меньше выступает поле int сила, а при сравнении на равенство реализуется значимая семантика (то есть попарно сравниваются все поля объектов).

namespace ConsoleApplication1

{

    class Monster : IComparable

    {

        public Monster(int сила, int умение, string имя)

        {

            this.сила = сила;

            this.умение = умение;

            this.имя = имя;

        }

       public void Passport()

        {

            Console.WriteLine("Монстр{0} \t сила ={1} умение={2}", имя, сила, умение);

        }

 

       public override bool Equals(object obj)

       {

           if (obj == null || GetType() != obj.GetType()) return false;

           Monster temp = (Monster)obj;

           return (сила == temp.сила && умение == temp.умение && имя == temp.имя);

       }

       public override int GetHashCode()

       {

           return имя.GetHashCode();

       }

//ПЕРЕГРУЗКА  ОПЕРАЦИЙ СРАВНЕНИЯ С ИСПОЛЬЗОВАНИЕМ СТАНДАРТНОГО ИНТЕРФЕЙСА

       public static bool operator ==(Monster a, Monster b)

       {

           return a.Equals(b);

       }

       /* ТО же самое с использованием метода CompareTo() интерфейса IComparable

           public static bool operator ==(Monster a, Monster b)

      {

          return (a.CompareTo(b)==0);

      }

        */

       public static bool operator !=(Monster a, Monster b)

       {

           return !a.Equals(b);

       }

       public static bool operator <(Monster a, Monster b)

       {

           return (a.CompareTo(b)<0);

       }

       public static bool operator >(Monster a, Monster b)

       {

           return (a.CompareTo(b) > 0);

       }

//Этот метод переопределяется ОБЯЗАТЕЛЬНО, так как это единственный метод //интерфейса IComparable

       public int CompareTo(object obj)

       {

           Monster temp = (Monster)obj;

           if (this.сила > temp.сила) return 1;

           if (this.сила < temp.сила) return -1;

           return 0;

       }

       string имя;

        int сила, умение;

    }

 

    class Program

    {

        static void Main(string[] args)

        {

            Monster Вася = new Monster(50, 50, "Вася");

            Вася.Passport();

            Monster Петя = new Monster(100, 100, "Петя");

            Петя.Passport();

            if (Вася > Петя) Console.WriteLine("Вася сильнее Пети");

            else if (Вася == Петя) Console.WriteLine("Монстры равны по силе");

            else Console.WriteLine("Вася слабее Пети");

            Console.ReadLine();

        }

    }

}


Информация о работе Перегрузка методов и операций в классах