Совершенствование безопасности типов за счет явной реализации интерфейсных методов (Джефри Рихтер)
public interface IComparable
{
int CompareTo(object other);
}
internal struct SomeValueType : IComparable
{
private int m_x;
public SomeValueType(int x)
{
this.m_x = x;
}
public int CompareTo(SomeValueType other)
{
return (m_x - other.m_x);
}
int IComparable.CompareTo(object other)
{
return (m_x - ((SomeValueType)other).m_x);
}
}
Подскажите пожалуйста, есть данный код. В книге говорится, что при сокрытии реализации интерфейсного метода и добавлении его публичной копии с нужным типом мы получаем безопасность типа при его сравнении, убирая упаковку и проверку на этапе компиляции. Но в чем смысл тогда реализации самого интерфейса IComparable если мы не используем метод интерфейса и не можем выставить по нему ограничение. Мы получается так же можем создать экземпляр структуры без наследования от интерфейса и вызывать метод CompareTo, который стал его публичным методом. А вот в случае создания какого-то метода типа
public void Compare<T>(T o1, SomeValueStruct o2) where T : IComparable
{
o1.CompareTo(o2);
}
Мы все равно вызываем проверку через Object. И я не могу объяснить себе этой безопасности типов через интерфейс.
Ответы (1 шт):
В этом вопросе можно отметить два преимущества, 1- наличие нужного(перегруженного) компаратора точно сравнит как надо два обьекта этих типов. 2е - в случае отсутствия перегруженного метода, всегда есть общий метод реализуемый интерфейсом. Тогда всю коллекцию разнообразных обьектов мы можем представить как List<IComparable> и обработать на сравнение, поиск искомого. А это основная причина наличия интерфейсов.