Skoro IEnumerable jest interfejsem, to czemu w kursie LINQ znalazłem coś takiego:
IEnumerable queryResult = ; Z tego co mi wiadomo, nie można tworzyć instancji interfejsu. Czym więc jest to po lewej stronie? Można tworzyć zmienne typu interfejsowego?
@g_vv: qieryResult przechowuje zmienną, która tylko implementuje interfejs IEnumerable. Oznacza że może to być dowolny obiekt, ważne aby implementował ten interfejs
@g_vv: Chodzi o to, żeby metoda z linq zwracała Ci obiekt o którym wiesz tylko tyle, że możesz iterować, ale nie chwalą się konkretną implementacji i jeśli nawet teraz to jest List a w przyszłej wersji postanowią zmienić implementację i będzie zwracać T[] albo w ogóle zrobią fikołka z yield to twój kod dalej będzie działał.
@g_vv: Object Oriented Programming do powtórki i zgoogluj "coding against an interface" i ewentualnie jak ci się bardzo nudzi to doczytaj czym jest L w SOLID
@g_vv: IEnumerable nie tworzy instancji. Możesz sobie zrobić query do bazy danych, a sam "strzał" odbędzie się w momencie materializacji (kiedy np. zrobisz .ToList() lub zwrocisz to przez endpoint). Jak sobie zobaczysz czym jest LIst to zobaczysz, że dziedziczy z IEnumerable. To jest najprostszy (pod względem skomplikowania) numerator w C#.
IEnumerable queryResult = ;Z tego co mi wiadomo, nie można tworzyć instancji interfejsu. Czym więc jest to po lewej stronie? Można tworzyć zmienne typu interfejsowego?
#pytanie #naukaprogramowania #csharp
IEnumerable queryResult = new List(); // dobrze
@g_vv: Chodzi o to, żeby metoda z linq zwracała Ci obiekt o którym wiesz tylko tyle, że możesz iterować, ale nie chwalą się konkretną implementacji i jeśli nawet teraz to jest List a w przyszłej wersji postanowią zmienić implementację i będzie zwracać T[] albo w ogóle zrobią fikołka z yield to twój kod dalej będzie działał.
Interfejs jest tylko kontraktem.