Важная информация
Показано с 1 по 5 из 5

Тема: реализация интерфейса IComparable<>

  1. #1 реализация интерфейса IComparable<> 
    Новичок
    Регистрация
    25.08.2015
    Сообщений
    3
    Сказал(а) спасибо
    1
    Поблагодарили 0 раз(а) в 0 сообщениях
    Здравствуйте!
    Нужна помощь в понимании сути происходящего.
    Ниже мой класс Person (c поляи firsName, lansName) как по учебнику реализует интерфейс IComparable<>. Далее в где то в методе MAIN создается массив объектов Person и реализация IComparable<> позволяет сделать сортировку внутри этого массива. Я не могу понять одного, как работает мой метод CompareTo с методом Sort() класса System.Array Понятно, что мой CompareTo() указывает способ сортировки объектов Person. Понятен принцип сортировки, но я не понимаю, хоть убей:

    1) Почему классу Person обязательно необходимо "наследовать" IComparable<>, почему просто недостаточно иметь в классе метод CompareTo()
    2) Как метод Sort() увязывается с моим методом CompareTo и принимает от него способ сортировки.

    Лично я грешу на то, что не до конца уловил суть интерфейсов, как они взаимодействуют с различными классами. Еще плохо, что на MSDN я вижу, например, сигнатуру метода Array.Sort(), но не вижу тело метода, что происходит внутри него. Но главное для меня, конечно, понять роль в этом всем интерфейса IComparable<>. Без понимания этого я просто не могу двигаться дальше, весь издергался уже. smile
    Корифеи, очень прошу объяснить этот момент!!!



    public class Person: IComparable<Person>
    {
    private string firstName;
    private string lastName;

    public string FirsName { get { return firstName; } set { firstName = value; } }
    public string LastName { get { return lastName; } set { lastName = value; } }

    public Person(string firstName, string lastName)
    {
    this.firstName = firstName;
    this.lastName = lastName;
    }

    public int CompareTo(Person other)
    {
    if (other == null) return 1;
    int result = string.Compare(this.LastName, other.LastName);
    if (result == 0)
    {
    result = string.Compare(this.FirsName, other.FirsName);
    }
    return result;
    }
    Ответить с цитированием  
     

  2. #2  
    Профи
    Регистрация
    09.11.2013
    Сообщений
    271
    Сказал(а) спасибо
    17
    Поблагодарили 80 раз(а) в 54 сообщениях
    string.Compare сравнивает содержимое строк, а IComparable<> сравнивает содержимое типа. это совершенно разные вещи. Если не наследовать IComparable<> вы не сможете сравнить тип Person и other, так как в нем прописан метод Compare для сравнивания типов. Собственно только для этого этот интерфейс и был написан. Вы 2 раза сравниваете строки, это не ошибка, необходимо для приличия сначала сравнить типы и если они совместимы, то сравнивать строки. Сравнивать типы нужно потому, что они не заданы явно, то есть вполне возможно, что в other вообще нет строковых полей...
    Ответить с цитированием  
     

  3. Пользователь сказал cпасибо:

    SemenKandiba (26.08.2015)

  4. #3  
    Новичок
    Регистрация
    25.08.2015
    Сообщений
    3
    Сказал(а) спасибо
    1
    Поблагодарили 0 раз(а) в 0 сообщениях
    Спасибо, за проявленный интерес к моему вопросу. Но у меня пока картинка не складывается. А именно, я не понимаю, как вызывается мой метод CompareTo() класса Person, почему он вызывается и какова в это роль интерфейса IComparable<>. Мне нужно это понять, очень нужно. Помогите, пожалуйста.
    Ниже мой вызывающий код. За сч


    class Program
    {


    static void Main(string[] args)
    {
    Person[] people =
    {
    new Person("Jhon", "Smith"),
    new Person("Mike", "Tison"),
    new Person("Anna", "Chapman"),
    new Person("Simon", "Lee")
    };

    Array.Sort(people);

    foreach (var i in people)
    {
    Console.WriteLine("{0} {1}", i.FirsName, i.LastName);
    }
    Console.ReadKey();

    }
    Ответить с цитированием  
     

  5. #4  
    Разбирающийся
    Регистрация
    18.04.2014
    Адрес
    Ярославль
    Сообщений
    69
    Сказал(а) спасибо
    0
    Поблагодарили 65 раз(а) в 33 сообщениях
    Записей в блоге
    2
    [Ссылки могут видеть только зарегистрированные пользователи. ] - прочитайте внимательно тут ответ на ваш вопрос.
    Если в коротко. Метод sort, использует реализованный вами метод compareTo для сравнения элементов массива.
    Если хотите досконально понять. Вам надо попробовать написать с нуля алгоритм сортировки generic массива. Это будет лучший способ вникнуть и осознать.
    Ответить с цитированием  
     

  6. #5  
    Новичок
    Регистрация
    25.08.2015
    Сообщений
    3
    Сказал(а) спасибо
    1
    Поблагодарили 0 раз(а) в 0 сообщениях
    Спасибо большое!
    Последний вопрос, подскажите, пожалуйста, почему для того, что бы Sort() получил доступ к моему методу CompareTo() (или "знал", что нужно использовать его), необходимо при объявлении класса Person() обязательно подписываться на IComparable<>. Без подписки на этот интерфейс код не работает.
    Ведь подписываясь на интерфейс я просто обязуюсь, грубо говоря, реализовать его абстрактные члены, не больше. Это для меня тонкий момент. Это, видимо в меньшей степени относится к алгоритмизации, такая "фишка" .NETa
    Если не затруднит, можете пояснить?
    Ответить с цитированием  
     

Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 120
    Последнее сообщение: 23.03.2016, 18:01
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •