[oop] интерфейсы
дайте какой-нибудь пример использования интерфесов
когда имеет смысл использовать интерфейсы?когда есть полиморфизм
какие это дает преимущества по сравнению с классами?поддержку полиморфизма, классы не поддерживают полиморфизм полностью
дайте какой-нибудь пример использования интерфесов
void Output(IEnumerable<int> items)
{
foreach (var item in items)
Console.WriteLine(item);
}
IEnumerable<int> Generate(int min, int max)
{
for (int i = min; i < max; ++i)
yield return i;
}
var list = new List<int>
var dictionary = new Dictionary<int, int>
var myCollection = new MyCollection<int>
Output(list);
Output(dictionary.Keys);
Output(dictionary.Values);
Output(myCollection);
Output(Generate(10, 100;
примерно понял, спасибо
Иначе - лучше пользоваться абстрактными классами.
Плюсы получается недополиморфизмны?
>классы не поддерживают полиморфизм полностьюМожет быть, имелись в виду неабстрактные классы.
Плюсы получается недополиморфизмны?
0) сопряжение различных частей системы - определяете интерфейсы взаимодействия, каждая группа колбасит свою часть ( + в теории параллельно пишутся тесты на определение конформности (тестерами) исходя из этих интерфейсов )
и определяете интерфейсы объектов которыми обмениваетесь в процессе взаимодействия.
1) для подключаемых компонент - по-моему достаточно значимое преимущество. классы для такого использования недостаточно полиморфны.
(см. например статьи про IoC: здесь )
p.s.: лично я сейчас пришел к тому что классы делать просто контейнерами полей - т.е. без методов, методы все выносить в хелперы (т.е. четкое разделение данных и их обработки).
соответственно класс реализует какой-то интерфейс (или несколько, как напроектировал).
Плюсы получается недополиморфизмны?интерфейсы в C++ есть, только в коде записываются как abstract class.
А в плюсах есть множественное наследование?
вопрос похож на издевательский.
Нет, я просто действительно не в курсе.
плюсы - один из небольшого числа языков, которые поддерживают множественное наследование не только на уровне интерфейсов, но и на уровне реализаций(на уровне классов)
поддержку полиморфизма, классы не поддерживают полиморфизм полностьюа можно подробнее пояснить?
а можно подробнее пояснить?Может, имелась в виду известная проблема наследования Круга и Эллипса?
Типа что круг является частным случаем эллипса для методов, читающих параметры, но эллипс является частным случаем круга для методов, изменяющих параметры (обратное в обоих случаях неверно). Поэтому прямо отнаследовать один от другого невозможно, а разнесение функциональности на четыре интерфейса позволяет реализовать все ваши самые смелые мечты!
а можно подробнее пояснить?полиморфизм - умение работать с разнородными вещами одинаковым способом
интерфейс - декларация стыка без реализации
класс - декларация с реализацией
т.к. множественное наследование классов приводит к сложному коду/не поддерживается, то на классах фактически можно построить только линейную цепочку наследования: A -> B -> C
соответственно мы получим лишь частный случай полиморфизма: умение работать одинаковым способом с однородными вещами
Т.е. с читающими:
эллипс: getAxisA, getAxisB
круг: getAxisA, getAsixB, getRadius.
Круг частный случай эллипса в том смысле, что множество читающих методов для эллипса включено в множество читающих методов для круга.
В случае изменяющих:
эллипс: setAxisA, setAxisB
круг: setRadius
Множества методов находятся в общем положении, никто не является ничьим частным случаем. Или подразумевается что эллипс тоже имеет метод setRadius?
http://en.wikipedia.org/wiki/Circle-ellipse_problem вопрос отпал.
Ой. В свете Оставить комментарий
state7401281
когда имеет смысл использовать интерфейсы?какие это дает преимущества по сравнению с классами?