prasad13.sawant Ответов: 1

C# Oops концептуальный вопрос, связанный с интерфейсом


Почему мы используем интерфейс и когда мы должны его использовать?

Richard MacCutchan

Вы можете найти ответ довольно просто, проведя некоторые исследования для себя. Либо читайте книгу, либо используйте Google, Bing и т. д.

1 Ответов

Рейтинг:
9

OriginalGriff

По сути, интерфейсы - это способ обеспечить своего рода множественное наследование в C#.

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

Они предоставляют контракт: "если вы реализуете необходимые биты, вы можете рассматриваться как один из нас". Например, если ваш класс Students является производным от People и реализует IEnumerable, то он имеет все функции People, но его также можно использовать в цикле foreach.

Там, где классы реализуют один и тот же интерфейс, все они могут использоваться одним и тем же способом и через один и тот же набор методов, несмотря на то, что в противном случае они не связаны между собой классами.

Также смотрите здесь: http://msdn.microsoft.com/en-us/library/87d83y5b(v=против 80). aspx[^]
а здесь: http://en.wikibooks.org/wiki/C_Sharp_Programming/Interfaces[^]



"Итак,если необходимо определить каждую вещь в классе, реализующем интерфейс, то зачем нам нужен интерфейс, мы можем объявить и определить все вещи только в этом классе. Это главное сомнение, которое у меня есть, поскольку мы должны определить каждый метод и переменные в реализующем классе, то мы можем объявить эти переменные в этом классе только тогда, когда нет необходимости в интерфейсном ритуале?"

Нет.: смейтесь:
Давайте на минуту забудем о компьютерах.

Когда я поступил в университет (давным-давно), это было так называемое «закрытое дело» - это было законное требование вступить в Студенческий союз (единственный профсоюз, в который я когда-либо вступал) и до тех пор, пока вы не вступите ( и платили ежегодный взнос, давайте не будем забывать о членских взносах) вы не могли посещать лекции, вы не могли вступить в Union Bar (где продавали дешевое пиво, поскольку это был членский клуб), вы не могли вступить ни в один Социальные клубы университета. Потому что все они требовали, чтобы вы подписали свою членскую карту Студенческого союза, чтобы доказать, что у вас есть право быть членом: вы учились в правильном университете. Скорее всего, в вашей стране есть что-то подобное.

Если вы думаете о UnionMembership как о интерфейсе, он ничего не передает. Никаких льгот. Мой студенческий класс должен был реализовать UnionMembership, чтобы получить его свойство: UnionMembership.MemberCard-и выполнить его метод: PayFeeEveryYear(двойные лоты).
Но мой ученик должен был быть человеком (который включает в себя гораздо больше свойств и методов), на многие из которых класс ученика не должен влиять: имя, адрес, номер социального страхования, родители ...
Но вы не можете наследовать от двух несвязанных классов! Понятно, что было решено, что это слишком сложно и дает слишком много проблем на практике.

Интерфейс дает нам не способ вывести из двух классов, а вместо этого способ вывести из базового класса (человека) и включить членство в другой класс, а также получить все преимущества, которые дает такое членство:

public class Student : Person, IUnionMembership
   {
   ...
   }


Есть ли в этом смысл?


Suvabrata Roy

Хорошо сказано но я хотел бы добавить еще несколько моментов,
1. Потерять Сцепление
2. Зависимость подпись
3. Зависящее от реализации поведение
4. Ди

OriginalGriff

Да, но для новичка у них, вероятно, есть о чем подумать для начала! :смеяться:

Suvabrata Roy

Да, я согласен с вами...

prasad13.sawant

спасибо.

OriginalGriff

Пожалуйста!

prasad13.sawant

У меня есть еще один вопрос. Если мы используем IEnumerable для целей интерфейса, то почему нет необходимости определять его методы в реализующем классе, то есть там, где мы реализуем интерфейс, так как необходимо определять члены и методы класса IEnumerable.

OriginalGriff

Это.
Класс, реализующий IEnumerable, должен включать класс GetEnumerator:
public IEnumerator GetEnumerator()
{
...
}
Если нет, то компилятор будет жаловаться:
"Имя вашего класса" не реализует систему "член интерфейса".Коллекции.интерфейс IEnumerable.Метод getenumerator()'

Если вы объявите интерфейс, реализующий IEnumerable, то все производные классы должны реализовать метод GetEnumerator - вы не можете объявить его в определении интерфейса, так как он вообще не может содержать никакого кода.

prasad13.sawant

Итак,если необходимо определить каждую вещь в классе, реализующем интерфейс, то зачем нам нужен интерфейс, мы можем объявить и определить все вещи только в этом классе. Это главное сомнение, которое у меня есть, поскольку мы должны определить каждый метод и переменные в реализующем классе, то мы можем объявить эти переменные в этом классе только тогда, когда нет необходимости в интерфейсном ритуале?

OriginalGriff

Ответ обновлен