|
c# Интерфейсы способы применения
|
|||
---|---|---|---|
#18+
Здравствуйте. Уже как второй день подряд пытаюсь разобраться с для чего нужны эти интерфейсы и абстрактные классы. Дело в том то мне не ясно, какое преимущество я получаю использую такую логику. [spoiler] Сошлюсь на этот видео урок ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2014, 13:14 |
|
c# Интерфейсы способы применения
|
|||
---|---|---|---|
#18+
а) Интерфейсы могут быть применены в РАЗНЫХ классах, а не только в каком-то конкретном, что делает универсальным зоопарки очень разных классов - пример - интерфейс IEnumerable - с помощью него, например, можно пройти foreach-ем массив, тектовую строку, коллекцию, словарь и что угодно, в том числе, ты можешь реализовать IEnumerable на собственном любом классе и потом обходить его foreach-ем или Linq-запросами... б) Класс может наследовать только одному базовому классу, но любому количеству интерфейсов ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2014, 13:30 |
|
c# Интерфейсы способы применения
|
|||
---|---|---|---|
#18+
Nechto, На самом деле, про интерфейсы столько замысловатых повествований в сети и в учебниках, и что бы вдуплиться не один день уйдет у новичка. Вообще то с интерфейсами все просто, у нас запрещено множественное наследование в коде пользователя. то есть, Вы без труда можете отнаследоваться от абстрактного класса, а от двух? не получится. Вот тут и создатели пошли на такую хитрость, второй и последующие абстрактные классы они заменили словом интерфейс. а в самих классах убрали методы с реализацией и конструктор, оставив только абстрактные методы. то есть интерфейс это такой же абстрактный класс, без методов с реализацией и конструктора, ну естественно финализатор там никто не видел, не верите, откройте байт код и посмотрите, то есть им там можно, множественные наследования, а нам нельзя.Хм... Если нет конструктора, то естественно конструктор этого абстрактного класса и не будет задействован с стеке вызовов конструкторов и все увянет на последнем вызове конструктора объекта ( мы говорим про ссылочные типы) Хотя можно и создать объект и без вызова конструктора По второму, я согласен с вами ( хотя фильм не смотрел) можно и было бы запихнуть и в базовый класс.. Но бываю в жизни и такие моменты, когда нужно реализовывать И. например foreach требует что бы левый элемент реализовывал IEnumerable Ну уж если пошел разговор о IEnumerable Вспомним про IDisposable вы то его никуда не запихнете в базовый класс. У вас тогда не встанет директива using да бог с ней, у вас и не вызовется автовызов исполнения этого интерфейса. ну не используя using вы додавите Dispose() через базовый класс. А в другом случае ( вообще два случая авто вызова ( классических)IDisposable ) вообще никакой эрекции не будет.. Как то так.. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2014, 14:30 |
|
c# Интерфейсы способы применения
|
|||
---|---|---|---|
#18+
Где-то в степи то есть интерфейс это такой же абстрактный класс Да ну, ерунда какая. Если что-то является классом, то это подразумевает реализацию класса, и наследование этой реализации (даже если реализация вырожденная). А интерфейс - это просто контракт, объявляющий, что если некий класс реализует этот интерфейс, то этот класс обязан иметь методы, объявленные в интерфейсе. И все. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2014, 16:56 |
|
c# Интерфейсы способы применения
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, интерфейс это обыкновенный тип и реализован в виде класса, тоже самое и структуры, имеют реализацию класса только запечатанного и наследующего valueType, а то о чем вы говорите - это матрица есть люди которые пишут в байт коде им множественное наследование доступно, на хабре это один перец показательно исполнил.. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2014, 17:12 |
|
c# Интерфейсы способы применения
|
|||
---|---|---|---|
#18+
Сон Веры Павловныинтерфейс - это просто контракт, не совсем просто - явная реализация интерфейса - тому пример ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2014, 17:26 |
|
c# Интерфейсы способы применения
|
|||
---|---|---|---|
#18+
ИзопропилСон Веры Павловныинтерфейс - это просто контракт, не совсем просто - явная реализация интерфейса - тому примерявная реализация интерфейса это класс. Сон Веры Павловны, Shocker.Pro +1 Где-то в степи, Изопропил -1 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2014, 18:39 |
|
c# Интерфейсы способы применения
|
|||
---|---|---|---|
#18+
Antonariyявная реализация интерфейса это класс что сказать то хотел? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2014, 19:00 |
|
c# Интерфейсы способы применения
|
|||
---|---|---|---|
#18+
Shocker.Proа)Интерфейсы могут быть применены в РАЗНЫХ классах Shocker.Proа)можешь реализовать IEnumerable Сон Веры Павловны а)А интерфейс - это просто контракт, объявляющий, что если некий класс реализует этот интерфейс, то этот класс обязан иметь методы, объявленные в интерфейсе. И все. Значит для этого создавались интерфейсы? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2014, 19:37 |
|
c# Интерфейсы способы применения
|
|||
---|---|---|---|
#18+
Antonariy, авторГде-то в степи, Изопропил -1 а что не нравится ? можно было бы и без меня привести утиный тест между интерфейсом и абстрактным классом никуда не заглядывая если уж заговорили про утиную типизацию, то кричать надо на строчку степьнапример foreach требует что бы левый элемент реализовывал IEnumerable или на Shocker.Pro ты можешь реализовать IEnumerable на собственном любом классе и потом обходить его foreach-ем в общем то эрекция происходит не на IEnumerable , а на IEnumerator GetEnumerator() Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48.
тут к стати показан второй классический авто вызов IDisposable ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2014, 19:55 |
|
c# Интерфейсы способы применения
|
|||
---|---|---|---|
#18+
Nechto, авторЗначит для этого создавались интерфейсы вообще эволюция познания поэтапна , в начале берется первоначальное представление ( простое для понимания)( лично я дал считаю именно такое), а потом с опытом и приобретениями оно обрастает, или отвергается полностью в замен истины. ну это все субъективно и имхо.. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2014, 20:06 |
|
c# Интерфейсы способы применения
|
|||
---|---|---|---|
#18+
повышение уровня абстракции. все ООП на этом построено. в интерфейсах задается поведение. например, некоторые сущности умеют выполнять какое-то действие1. эти сущности может обрабатывать некоторая общая инфраструктура. она ничего не знает о деталях реализации этих сущностей, а тольео знает о том, что они выполняют действие1 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2014, 20:36 |
|
c# Интерфейсы способы применения
|
|||
---|---|---|---|
#18+
ИзопропилAntonariyявная реализация интерфейса это класс что сказать то хотел?а сам что хотел? ИзопропилСон Веры Павловныинтерфейс - это просто контракт, не совсем просто - явная реализация интерфейса - тому примеро чем этот пассаж? "интерфейс это не просто контракт и класс тому пример" — эта мысль настолько глубока, что ее смысл пропал где-то на дне. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2014, 22:02 |
|
c# Интерфейсы способы применения
|
|||
---|---|---|---|
#18+
NechtoСон Веры Павловныа)А интерфейс - это просто контракт, объявляющий, что если некий класс реализует этот интерфейс, то этот класс обязан иметь методы, объявленные в интерфейсе. И все. Значит для этого создавались интерфейсы?Да. Использование интерфейсов — один из вариантов обеспечения полиморфизма в объектных языках и средах. Все классы, реализующие один и тот же интерфейс, с точки зрения определяемого ими поведения, ведут себя внешне одинаково. Это позволяет писать обобщённые алгоритмы обработки данных, использующие в качестве типов параметры интерфейсов, и применять их к объектам различных типов, всякий раз получая требуемый результат. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2014, 22:27 |
|
c# Интерфейсы способы применения
|
|||
---|---|---|---|
#18+
Как один из вариантов, зачем нужны интерфейсы - http://msdn.microsoft.com/en-us/magazine/cc337885.aspx (если на английском разметка кода вся "в кучу" - перейди на русский). В частности авторDependency Inversion You can decouple your higher-level component, InvoiceService, from its lower-level dependencies by interacting with your dependencies via interfaces rather than their concrete classes: ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2014, 08:02 |
|
c# Интерфейсы способы применения
|
|||
---|---|---|---|
#18+
Правда, стоит сказать, что инвесию можно получить и через базовые классы (через абстрактные базовые классы). Но это я в качестве примера же привёл. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2014, 08:04 |
|
c# Интерфейсы способы применения
|
|||
---|---|---|---|
#18+
Где-то в степиNechto, На самом деле, про интерфейсы столько замысловатых повествований в сети и в учебниках, и что бы вдуплиться не один день уйдет у новичка. Вообще то с интерфейсами все просто, у нас запрещено множественное наследование в коде пользователя. то есть, Вы без труда можете отнаследоваться от абстрактного класса, а от двух? не получится. Вот тут и создатели пошли на такую хитрость, второй и последующие абстрактные классы они заменили словом интерфейс. а в самих классах убрали методы с реализацией и конструктор, оставив только абстрактные методы. то есть интерфейс это такой же абстрактный класс, без методов с реализацией и конструктора, ну естественно финализатор там никто не видел, не верите, откройте байт код и посмотрите, то есть им там можно, множественные наследования, а нам нельзя.Хм... Если нет конструктора, то естественно конструктор этого абстрактного класса и не будет задействован с стеке вызовов конструкторов и все увянет на последнем вызове конструктора объекта ( мы говорим про ссылочные типы) Хотя можно и создать объект и без вызова конструктора По второму, я согласен с вами ( хотя фильм не смотрел) можно и было бы запихнуть и в базовый класс.. Но бываю в жизни и такие моменты, когда нужно реализовывать И. например foreach требует что бы левый элемент реализовывал IEnumerable Ну уж если пошел разговор о IEnumerable Вспомним про IDisposable вы то его никуда не запихнете в базовый класс. У вас тогда не встанет директива using да бог с ней, у вас и не вызовется автовызов исполнения этого интерфейса. ну не используя using вы додавите Dispose() через базовый класс. А в другом случае ( вообще два случая авто вызова ( классических)IDisposable ) вообще никакой эрекции не будет.. Как то так.. Жопа с интерфейсами (а точнее, с наследованием в C#) в том, что, если мне нужно унаследовать реализацию , а не сигнатуру, то придётся городить длинный хвост наследования "по штучке" из классов. Либо копипастить реализацию интерфейсов из тех классов, в которых находится нужная мне. Или есть методы лучше? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2014, 08:06 |
|
c# Интерфейсы способы применения
|
|||
---|---|---|---|
#18+
Я бы даже сказал, что интерфейсы всегда абстрактны, в то время как абстрактные классы хотя бы могут иметь конкретную реализацию (т. е. не в полной мере абстрактны). ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2014, 08:10 |
|
c# Интерфейсы способы применения
|
|||
---|---|---|---|
#18+
user7320Жопа с интерфейсами (а точнее, с наследованием в C#) в том, что, если мне нужно унаследовать реализацию , а не сигнатуру, то придётся городить длинный хвост наследования "по штучке" из классов. Либо копипастить реализацию интерфейсов из тех классов, в которых находится нужная мне. Или есть методы лучше? Ну или заниматься "внедрением зависимостей". ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2014, 08:11 |
|
c# Интерфейсы способы применения
|
|||
---|---|---|---|
#18+
Nechto, вот это определение наиболее точно: Сон Веры Павловныа)А интерфейс - это просто контракт, объявляющий, что если некий класс реализует этот интерфейс, то этот класс обязан иметь методы, объявленные в интерфейсе. И все. А вот еще видеоурок по теме, может, станет понятнее: [youtube= ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2014, 09:40 |
|
c# Интерфейсы способы применения
|
|||
---|---|---|---|
#18+
user7320, обыкновенные люди… в общем, напоминают прежних (c) ага накидали определений, он наверное все это и раньше видел(ТА) и от этого сюда кинулся, а тут ему опять по новой )) Задумайтесь, что первично clr или #? Наверное кто читал Рихтера раз 5-6 встречали в повествовании такую строчку. - Но создатели C# посчитали нужным.(с) ( или близко по смыслу) а теперь выйдем из матрицы Предположим создатели не создавали понятие интерфейс а вместо него был бы Код: c# 1. 2. 3. 4.
к стати из байт кода практически примерно так и смотрится. а во всех учебниках и хелпах разжевывалось бы понятия спецификатора interface : что запрещает иметь в классе, и для чего он нужен.. конечно нудно, громоздко, дорого но мы бы терпели.. И что? прально матрица бы поменялась.. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2014, 11:24 |
|
c# Интерфейсы способы применения
|
|||
---|---|---|---|
#18+
user7320Жопа с интерфейсами (а точнее, с наследованием в C#) в том, что, если мне нужно унаследовать реализацию , а не сигнатуру, то придётся городить длинный хвост наследования "по штучке" из классов. Либо копипастить реализацию интерфейсов из тех классов, в которых находится нужная мне.Это не "жопа с интерфейсами", они тут вообще ни при чем. Отсутствие множественного наследования это "жопа языка" и "жопа компилятора". А интерфейсы как костыль помогают сделать вид, что оно есть. И да, мне множественного наследования тоже не хватает. user7320Или есть методы лучше?Конечно есть. Создать свой проджект айтем с куском нужного кода, и не заниматься копипастой. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2014, 11:24 |
|
c# Интерфейсы способы применения
|
|||
---|---|---|---|
#18+
Код: c# 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2014, 12:06 |
|
c# Интерфейсы способы применения
|
|||
---|---|---|---|
#18+
Nechto Код: c# 1. 2. 3. 4. 5. 6. 7.
Интерфейсы вообще не обязательно использовать. Если вы выстроили себе модель наследования обьектов то вам и не нужно создавать интерфейсы ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2014, 13:25 |
|
c# Интерфейсы способы применения
|
|||
---|---|---|---|
#18+
Antonariyuser7320Жопа с интерфейсами (а точнее, с наследованием в C#) в том, что, если мне нужно унаследовать реализацию , а не сигнатуру, то придётся городить длинный хвост наследования "по штучке" из классов. Либо копипастить реализацию интерфейсов из тех классов, в которых находится нужная мне.Это не "жопа с интерфейсами", они тут вообще ни при чем. Отсутствие множественного наследования это "жопа языка" и "жопа компилятора". А интерфейсы как костыль помогают сделать вид, что оно есть. И да, мне множественного наследования тоже не хватает. user7320Или есть методы лучше?Конечно есть. Создать свой проджект айтем с куском нужного кода, и не заниматься копипастой. Я пока нашёл только такие способы: - внедрение зависимостей (например, передаём нужный объект в конструктор); - хелперы на статических методах (которым нужен свой статический класс). Минус первого метода - нужно где-то инстанцировать внедряемый объект вне объекта, в который внедряем. Т. е. нужен третий объект. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2014, 13:31 |
|
|
start [/forum/topic.php?fid=20&msg=38645105&tid=1402909]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 155ms |
0 / 0 |