Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2011, 17:20   #1
MyLastHit
Очень суровый
Участник клуба
 
Аватар для MyLastHit
 
Регистрация: 17.12.2009
Сообщений: 1,988
Печаль Объясните смысл интерфейсов

Здравствуйте. Дочитываю Шилдта, но остается очень много неясностей. В частности - каков смысл интерфейсов?
Например возьмем код из MSDN:
Код:
interface IEquatable<T>
{
    bool Equals(T obj);
}
Код:
public class Car : IEquatable<Car>
{
    public string Make {get; set;}
    public string Model { get; set; }
    public string Year { get; set; }

    // Implementation of IEquatable<T> interface
    public bool Equals(Car car)
    {
        if (this.Make == car.Make &&
            this.Model == car.Model &&
            this.Year == car.Year)
        {
            return true;
        }
        else
            return false;
    }
}
Тоже самое делает и просто код:
Код:
public class Car
{
    public string Make {get; set;}
    public string Model { get; set; }
    public string Year { get; set; }
    public bool Equals(Car car)
    {
        if (this.Make == car.Make &&
            this.Model == car.Model &&
            this.Year == car.Year)
        {
            return true;
        }
        else
            return false;
    }
}
Может я чего-то не понимаю, но интерфейсы нужны только для того, чтобы методы прописанные в классе с указанным интерфейсом жестко следовали методам интерфейса?(принимаемые параметры, тип возвр. значения)
Ненавижу быть как все, но люблю, чтобы все были как я.
MyLastHit вне форума Ответить с цитированием
Старый 22.11.2011, 17:42   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Интерфейс — это просто набор соглашений. Если класс имплементирует IEquatable, он должен реализовать Equals(). Фактически, то же самое можно реализовать и через множественное наследование, но с интерфейсами получается удобней.

Из С# in a Nutshell:

Цитата:
• A class can implement multiple interfaces. In contrast, a class can inherit from only a single class.

• Interface members are all implicitly abstract. In contrast, a class can provide both abstract members and concrete members with implementations.

• Structs can implement interfaces. In contrast, a struct cannot inherit from a class.
Вот ещё хороший пример оттуда же:

Цитата:
Consider the following classes:

abstract class Animal {}
abstract class Bird : Animal {}
abstract class Insect : Animal {}
abstract class FlyingCreature : Animal {}
abstract class Carnivore : Animal {}

// Concrete classes:
class Ostrich : Bird {}
class Eagle : Bird, FlyingCreature, Carnivore {} // Illegal
class Bee : Insect, FlyingCreature {} // Illegal
class Flea : Insect, Carnivore {} // Illegal

The Eagle, Bee, and Flea classes do not compile because inheriting from multiple classes is prohibited. To resolve this, we must convert some of the types to interfaces. The question then arises, which types? Following our general rule, we could say that insects share an implementation, and birds share an implementation, so they remain classes. In contrast, flying creatures have independent mechanisms for flying, and carnivores have independent strategies for eating animals, so we would convert FlyingCreature and Carnivore to interfaces:

interface IFlyingCreature {}
interface ICarnivore {}
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 22.11.2011, 17:51   #3
MyLastHit
Очень суровый
Участник клуба
 
Аватар для MyLastHit
 
Регистрация: 17.12.2009
Сообщений: 1,988
По умолчанию

Спасибо! Более менее прояснилось.
Ненавижу быть как все, но люблю, чтобы все были как я.
MyLastHit вне форума Ответить с цитированием
Старый 22.11.2011, 17:57   #4
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
Фактически, то же самое можно реализовать и через множественное наследование, но с интерфейсами получается удобней.
Может, вы хотели сказать, с помощью абстрактного базового класса?
_-Re@l-_ вне форума Ответить с цитированием
Старый 22.11.2011, 17:59   #5
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

У тебя есть List разнородных объектов ( Машины, Помойка, Гаражи, Сарай, Отель). У них нет общих предков( кроме object, который наследуется неявно), но для всех надо сделать процедуру форматированного вывода названия объекта.. что делать? Писать огромные switch и смотреть приводиться ли объект к данному типу? Или сделать поддержку интерфейса iformattable во всех этих классах ,сделать преобразования объекта к этому интерфейсу и вызвать ToString? Допустим выбрали мы первый вариант, но у нас появились еще 20 разных сущностей..ии.. опять расширять switch?.. тогда, получается проще идти вторым вариантом и вообще ничего менять не надо будет. Без интерфейсов такую штуку можно сделать только с одним набором функций(отнаследоваться от одного класса). А что делать дальше? Если у нас два набора функций? .. Вот тогда-то и становиться понятно для чего это придумано. Интерфейс-шаг к унификации объектов. Т.е. они позволяют работать с разнородными объектами, как с одним. Кстати, недавно для себя открыл сериализацию..после дня мук получил хороший автосейв..)
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 22.11.2011, 18:17   #6
MyLastHit
Очень суровый
Участник клуба
 
Аватар для MyLastHit
 
Регистрация: 17.12.2009
Сообщений: 1,988
По умолчанию

Код:
Скарам,
спасибо.
Остался еще один вопрос. Вот дан интерфейс:
Код:
interface IEquatable<T>
{
    bool Equals(T obj);
}
И например он используется каким то классом. Метод в этом интерфейсе для данного класса уже существует, или его нужно вновь создать в классе?
т.е. нельзя в классе вместо например:
Код:
public bool Equals(Car car)
    {
         return true;
    }
Написать:
Код:
Equals(Car car){
    return true;
}
Ненавижу быть как все, но люблю, чтобы все были как я.
MyLastHit вне форума Ответить с цитированием
Старый 22.11.2011, 18:22   #7
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Может, вы хотели сказать, с помощью абстрактного базового класса?

С помощью одних базовых абстрактных классов не всё можно сделать. Нужно или множественное наследование, или интерфейсы. В примере с животными это показано:

Цитата:
class Eagle : Bird, FlyingCreature, Carnivore {} // Illegal
Интерфейсы IFlyingCreature и ICarnivore позволяют объявить орла, как нечто летающее и нечто хищное одновременно.

Кстати, interface IEquatable<T> был введён в С# 2.0 для того, чтобы уменьшить накладные расходы на boxing/unboxing при вызове object.Equals(), но это уже скорее технические подробности именно С#, мало относящиеся к теме.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 22.11.2011 в 18:29.
veniside вне форума Ответить с цитированием
Старый 22.11.2011, 18:37   #8
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
С помощью одних базовых абстрактных классов не всё можно сделать.
А я и не говорю, что всё можно. Просто обычно когда говорят про интерфейсы, вспоминают про абстрактные базовые классы, потому как они,эээ...так сказать, абстрактный базовый класс - отец интерфейса. Как-то так.
_-Re@l-_ вне форума Ответить с цитированием
Старый 22.11.2011, 18:43   #9
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Абстрактный базовый класс нельзя множественно наследовать. По крайней мере в С#. А так да, они похожи )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование интерфейсов .NET dis Общие вопросы .NET 4 25.09.2010 19:54
Краткий смысл. В чем цель и смысл вашей жизни? grenles Свободное общение 20 13.09.2010 07:13
Задача в Delphi. Объясните смысл! Sianessa Помощь студентам 13 31.03.2009 22:11
Объясните, пожалуйста смысл строки - res=d.year > year ? -1: (d.year < year? 0:1) Fynj Помощь студентам 2 17.12.2007 17:50