Как интерфейс может заменить класс? - PullRequest
0 голосов
/ 29 сентября 2011

Я создал метод под названием GetStudentMarks(). Возвращаемый тип этого метода - List<StudentMark>. Код работает хорошо, даже когда я заменил List<StudentMark> на IList<StudentMark>. Как интерфейс может заменить класс, если интерфейс содержит только объявления?

Ответы [ 3 ]

5 голосов
/ 29 сентября 2011

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

public interface IMyInterface{
 IList<string> SomeList { get; }
}

public class MyClass : IMyInterface {
  public IList<string> SomeList {
    get { 
      return new List<string>(){ "a", "b" , "c" }; 
    }
  }
}
2 голосов
/ 29 сентября 2011

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

public IList<string> MyStrings()
{
  return new List<string>(); // Cast happens here just before return (List -> IList)
}

Позже, если вам потребуется, вы можете привестиверните тип (IList) обратно в класс solid (List) и используйте его таким образом.

1 голос
/ 29 сентября 2011

Interface не может заменить Class.Interface может создать уровень абстракции , который скрывает фактический интерфейс реализации объекта (поэтому он называется interface ).Посмотрите на Полиморфизм для объяснения.

...