Задать вопрос

Пара глупых вопросов по полиморфизму и наследованию?

Почему нужно писать IList list = new List() , а не так List list = new List() ? Я понимаю для чего нужет интерфейс в общем смысле, но не понимаю для чего его нужно использовать именно в этой ситуации.

Что происходит в данной ситуации Base A = new Derived()? И чем она отличается от Derived B = new Derived()?
  • Вопрос задан
  • 3115 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 2
IlyaEvseev
@IlyaEvseev
Opensource geek
Уменьшается вероятность по ошибке обратиться к полям и методам List и Derived, не перечисленным в IList и Base.
То есть здесь не обязательное правило, а рекомендация для уменьшения потенциальных проблем - прячь объект от своих кривых рук за минимально достаточный интерфейс.
Ответ написан
Комментировать
@stringer
1. не надо так писать
Ваш вопрос не про полиморфизм... Полиморфное поведение может демонстрировать к примеру функция:
void Foo(IList list) { var bar = list[1]; }
если ожидается, что на вход может приходить не совсем new List(), или даже совсем не List, а некое хранилище, которое обеспечивает доступ к элементам по индексу, и ради этого это хранилище реализует IList.

2 ничем не отличается
Разница возникла бы в коде,
Base A;
switch(...)
{
  case 0:
    A = Derived_1();
    break;
  case 1:
    A = Derived_2();
   break;
}
A.Foo();

в точке, где происходит вызов Foo(), тут полиморфизм обеспечивает исполнение разных версий метода для _1() и _2() наследников. В таком коде если бы Вы написали объявление А как в вопросе, case 1: компилятор у Вас забраковал бы, не говоря уже о том, что _2() не исполнялось бы никогда.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы