В C# 7 можно будет реализовывать методы в интерфейсе

12 0

Сейчас во время интервью часто можно услышать вопрос – чем отличается интерфейс от абстрактного класса или просто класса. И ответ достаточно простой – у интерфейса не может быть реализации методов. Классы должны реализовывать все методы своих интерфейсов. Это не полный и не идеальный ответ, но достаточный.

Начиная с C# 7 (может 7.1) этот ответ станет неверным. В нем можно будет у интерфейсов писать реализацию по умолчанию, которую потом классы смогут переопределять. Microsoft показывает такой интерфейса:

interface ILogger

{

  void Log(LogLevel level, string message);

  void Log(Exception ex) => Log(LogLevel.Error, ex.ToString());

}

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

Я не знаю, поддерживаю ли я такое или нет. И чем же теперь интерфейс отличается абстрактного класса? Только тем, что позволяет множественное наследование. Мммм. Да уж. Пока не уверен, как я отношусь к этому, надо посмотреть, как народ начнет использовать. Я вижу, что именно в данном примере реализация по умолчанию реально полезна и выгодна. Но как это будет использоваться в реальности, будут ли злоупотреблять подобными вещами и как злоупотребление скажется на коде... Слишком много вопросов. 


Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку пока еще никто не лайкал и ты можешь быть первым


Комментарии

Евгений рнд

18 Сентября 2018

Сколько людей погорело на этом вопросе на собеседованиях?! Что еще раз подтверждает бессмысленность такого подхода к отбору специалистов.


Покемон

18 Сентября 2018

В Java 8 это уже давно есть. Это сделано для того, чтобы в множестве реализующих классов, не определять пустые методы там, где они не нужны. А выкидывать исключение в методе поумолчанию например. Врятли он годится для чего-то большего.


Владимир_

18 Сентября 2018

Ну сам по себе вопрос: "чем отличаются абстракные классы и интерфейсы?" - некоректен. Лучше бы узнать, в каких бы ситуациях было бы полезно применить абстрактный класс, а в каких интерфейс. И тут ничего не изменилось. Потому что интерфейс это чисто механизм полиморфизма и, с добавлением методов по умолчанию, ничего не изменилось. Создавать члены класса внутри интерфейса порежнему нельзя. Хотя можно, конечно, свойства, но те должны быть открытыми, что уродывало бы интерфейс, при неправильном использовании.
Абстрактный класс нужен больше для наследования, хоть и может выполнять роль в полиморфизме. То есть абстракный класс больше нужен, чтобы не повторяться


Владимир_

18 Сентября 2018

Никаго множественного наследования нет вообще


Владимир_

18 Сентября 2018

прошу прощение за повторение комента, было бы неплохо, после отправки сообщения затирать поля ввода, а то я подумал, что что-то не отправилось. после переоткрытия вкладки коментарий не отобразился, а в полях ввода остался текст. еще раз прошу прощения


Михаил Фленов

18 Сентября 2018

2Евгений рнд

Ой горят на этом вопросе, потому что не понимают разницу. И раньше достаточным ответом было: Интерфейс - это чистый declaration - ты только объявляешь протокол, как что-то должно работать. Абстрактный класс - это класс с реализаций по умолчанию, хотя некоторые могут использовать это и в качестве протокола (не является хорошим тоном, но не запрещается). Когда появится в интерфейсах реализация, то мое утверждение уже становится условностью. Да, это то, для чего они создавалиссь, но не и плоскогубцами можно забивать гвозди.

2Владимир_

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


Михаил Фленов

18 Сентября 2018

2Владимир_

Я не знаю, что у тебя не очистилось, потому что все поле для ввода комментария должно убираться и вместо него появлятся твой комментарий. Какой браузер используешь? Может где-то JS ошибка.


Владимир_

18 Сентября 2018

Классы - да. А вот интерфейсы - не механизм наследования. Этим и отличается. А вот вопрос мне не нравится, потому что это вопрос из категории: "угадай что хочет услышать человек его задавший". Хорошо было бы задавать  вопросы, на которые можно дать однозначный ответ.
А как можно ответить на вопрос чем отличается? Ну например ключевым словом. Вы это хотели услышать? Или в интерфейсах нельзя создавать приватные методы. Эти ответы говорят о понимании, что такое интерфейс или абстрактный класс?


Владимир_

18 Сентября 2018

Да, после ввода все убирается. Я обновил страницу, чтоб написать еще комент, и текст остался в полях ввода. Так, наверное, и задумано. Просто не очень удобно


Владимир_

18 Сентября 2018

Все думают по разному и у всех разный опыт. Да, я понимаю, что и на мой вопрос можно навыдумывать ответов. Я лишь за то, чтобы конкритизировать то, на что конкретно вы хотели бы получить ответ.
А по поводу новой фишки, реализация по умолчанию в интерфейсах не заменяет абстрактные классы. Можете спрашивать у собеседников - почему


Михаил Фленов

18 Сентября 2018

Какой у тебя браузер, у меня ничего не сохраняется.

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

+ Единственное, что ты сказал четко, это "Или в интерфейсах нельзя создавать приватные методы". Да, это правильно и без вопросов.

- "А вот интерфейсы - не механизм наследования" - как так, если интерфейсы можно наследовать, что ты имеешь ввиду?

- "Потому что интерфейс это чисто механизм полиморфизма" - а есть чистые и грязные полиморфизмы? Классы не обладают полиморфизмом? Интрфейсы не обладают полиморфизмом? Какое отличие ты хотел тут показать?

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

ПОВТОРЮСЬ - не нужно отвечать на вопросы, которые я задал в этом комментарии, это просто пример того, куда ведет вопрос и какой выстраивается диалог с человеком, с которым я провожу интервью.


Владимир_

18 Сентября 2018

Браузер - Firefox
Хорошо если вы ведете реальный диалог. Некоторые его не ведут, а ждут пока им скажут то, что они хотят услышать. В итоге все сведется к вопросу в каких случаях что полезно использовать. Если вести диалог. А если перечислять ответы по пунктам, типа "в интерфейсах нельзя создавать приватные методы", это мало о чем скажет. Просто я с таким сталкивался, когда собеседующий спрашивал такой абстрактный вопрос и ждал конкретного заготовленного ответа.
"у интерфейса не может быть реализации методов" - это похоже на заготовленный ответ. И я так понял, если так на него ответят, этого будет для вас достаточно. Вот только это вообще не показывает реальные отличия. Не понятно, нафига вообще интерфейс.


Добавить Комментарий

Еще что-нибудь

Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне