Как я могу перегрузить оператор "==", чтобы определить, совпадают ли два идентификационных номера? - PullRequest
0 голосов
/ 08 октября 2018

Мне нужно написать метод, который будет принимать два объекта сотрудника в качестве входных параметров и сравнивать их идентификаторы, чтобы определить, совпадают они или нет.

В настоящее время он неполон;но до сих пор у меня есть класс Employee, который наследует свойства имени и фамилии от класса «Person» и имеет идентификатор в качестве своего собственного свойства.Я пишу метод в файле сотрудников и уже создал 2 примера сотрудников в моей программе.Что касается перегрузки ==, я сталкиваюсь с ошибкой, которая говорит, что «Сотрудник» определяет оператор ==, но не переопределяет Object.Equals. «Он также говорит, что мне нужно определить«! = », Но я запутался вкак настроить перегрузку! =, когда она даже не фигурирует в этом методе.

Я видел два способа сделать метод сравнения: один возвращает true или false, а другой просто пишет "match "на консоль. Любой из них подойдет для моих целей, но я не могу найти обходной путь для ошибок или как я изменил бы код в этой ситуации, чтобы определить совпадение между двумя идентификаторами сотрудников. Здесьмой код ниже; я был бы признателен за любую информацию о том, что может идти не так! (у меня такое ощущение, что это может быть очень неправильно). Я также не уверен, как вызвать метод, но в настоящее время я пытаюсь понять этоout.

Файл программы:

namespace OperatorOverload
{
    class Program
    {
        static void Main(string[] args)
        {
            Employee example = new Employee();

            example.FirstName = "Kitty";
            example.LastName = "Katz";
            example.ID = 24923;

            Employee example2 = new Employee();
            example2.FirstName = "John";
            example2.LastName = "Dudinsky";
            example2.ID = 39292;

            Console.ReadLine();
        }
    }
}

Класс сотрудника:

namespace OperatorOverload
{
    class Employee : Person
    {
        public int ID { get; set; }

        public static bool operator==(Employee employee, Employee employee2)
        {
            if (employee.ID == employee2.ID)

                return true;        
            else           
                return false;
            }
        }
    }

Персона Класс:

namespace OperatorOverload

{
    public class Person
    {
       public string FirstName { get; set; }
        public string LastName { get; set; }      
    }
}

Ответы [ 5 ]

0 голосов
/ 08 октября 2018

Это лучший способ переопределить метод Equals:

public override bool Equals(object obj)
{
    if (obj is null) return false;
    if (ReferenceEquals(this, obj)) return true;
    if (obj.GetType() != this.GetType()) return false; //optional. depends on logic
    return this.ID.Equals(((Employee)obj).ID);
}
0 голосов
/ 08 октября 2018

Вы должны использовать этот класс.Переопределить метод operator!=, operator== и Equals(object).

class Employee : Person
    {
        public int ID { get; set; }

        public static bool operator ==(Employee employee, Employee employee2)
        {
            if (employee.ID == employee2.ID)
                return true;
            else
                return false;

            //but you should use 
            //return employee.ID == employee2.ID;
        }

        public static bool operator !=(Employee employee, Employee employee2)
        {
            return employee.ID != employee2.ID;
        }

        public override bool Equals(object obj)
        {
            var emp = obj as Employee;
            if (emp == null)
                return false;

            return this.ID.Equals(emp.ID);
        }
    }
0 голосов
/ 08 октября 2018

Вам нужно использовать функцию Equals и переопределить ее следующим образом:

public override bool Equals(object obj)
{
    var item = obj as Employee;

    if (item == null)
    {
        return false;
    }

    return this.ID.Equals(item.ID);
}
0 голосов
/ 08 октября 2018

Компилятор в основном говорит вам, что если вы хотите перегрузить оператор == для класса Employee, вам также придется переопределить метод Object.Equals и оператор! =, Чтобы получить согласованную семантику, которую вы можете использоватьсравнивать экземпляры типа Employee.

Это означает, что вам не нужно искать обходные пути: вам просто нужно перегрузить оператор! = и переопределить Object.Equals, чтобы объекты Employee сравнивались по идентификатору, а не по ссылке (как они делают по умолчанию, если вы не предоставите свою собственную семантику равенства).

0 голосов
/ 08 октября 2018

вам также необходимо переопределить метод Equals:

public override bool Equals(Object Obj)
{
    Person person = obj as Person;

    if(person == null)
        return false;

    return this.ID.Equals(person.ID);
}

Рекомендации от Microsoft :

Реализуйте метод GetHashCode при каждом выполнении Equalsметод.Это поддерживает синхронизацию Equals и GetHashCode.

Переопределяйте метод Equals всякий раз, когда вы реализуете оператор равенства (==), и заставляете их делать то же самое.

...