IEnumerable i Mock

0

A wiec idac za rada Cerrato, napisze tutaj kod ktorego nie rozumiem.

A wiec mam klase Samochod:

    public class Samochod
{
    public int ID { get; set; }
    public string Marka { get; set; }
    public string Model { get; set; }
    public int RokProdukcji { get; set; }
    public string Przebieg { get; set; }
    public string Pojemnosc { get; set; }
    public string RodzajPaliwa { get; set; }
    public string Moc { get; set; }
    public string Opis { get; set; }
    public decimal Cena { get; set; }
    public string ZdjecieUrl { get; set; }
    public string MiniaturkaUrl { get; set; }
    public bool JestSamochodemTygodnia { get; set; }
}

Intersejs:

  interface ISamochodRepository
{
        IEnumerable<Samochod> PobierzWszystkieSamochody();
        Samochod PobierzSamochodOID(int samochodID);
}

oraz klase MockSamochodRepository, ktora dziedziczy po interfejsie:

 public class MockSamochodRepository : ISamochodRepository
    {
        List<Samochod> samochody;

        public MockSamochodRepository()
        {
            if (samochody == null)
            {
                ZaladujSamochody();
            }
        }

        private void ZaladujSamochody()
        {
            samochody = new List<Samochod>
            {
                new Samochod { ID=1, Marka="Ford", Model="Mustang", RokProdukcji = 2016, Przebieg = "34 000 km", Pojemnosc = "4 900 cm3", RodzajPaliwa= "benzyna", Moc = "421 KM", Opis="Mam do sprzedania Mustanga 5.0 GT V8 421KM. Kupiony w Polskim SALONIE FORDA w Opolu jako NOWY w kwietniu 2016", Cena = 160000M, ZdjecieUrl="/images/fordMustang.jpg", MiniaturkaUrl="/images/fordMustang.jpg", JestSamochodemTygodnia = true},
                new Samochod { ID=2, Marka="Audi", Model="S5", RokProdukcji = 2013, Przebieg = "112 000 km", Pojemnosc = "3 000 cm3", RodzajPaliwa= "benzyna", Moc = "280 KM", Opis="Do sprzedania Audi S5 z 2013 roku. Jestem właścicielem tego samochodu od ponad dwóch lat.", Cena = 115000M, ZdjecieUrl="/images/audiS5.jpg", MiniaturkaUrl="/images/audiS5.jpg", JestSamochodemTygodnia = true},
                new Samochod { ID=3, Marka="BMV", Model="X4", RokProdukcji = 2017, Przebieg = "4 300 km", Pojemnosc = "1 995 cm3", RodzajPaliwa= "benzyna", Moc = "190 KM", Opis="BMV X4 20d xDrive. Samochód krajowy. Samochód serwisowany. Wystawiamy fakturę VAT 23%. Samochód bezwypadkowy. I właściciel.", Cena = 194000M, ZdjecieUrl="/images/bmvx4.jpg", MiniaturkaUrl="/images/bmvx4.jpg", JestSamochodemTygodnia = true},
                new Samochod { ID=4, Marka="Chevrolet", Model="Corvette", RokProdukcji = 1972, Przebieg = "28 000 km", Pojemnosc = "5 700 cm3", RodzajPaliwa= "benzyna", Moc = "300 KM", Opis="Corvetta jest w świetnym stanie wizualnym i mechanicznym. Oczywiście jest ZAREJESTROWANA i ubezpieczona w PL.", Cena = 90000M, ZdjecieUrl="/images/chevroletCorvete.jpg", MiniaturkaUrl="/images/chevroletCorvete.jpg", JestSamochodemTygodnia = true},
                new Samochod { ID=5, Marka="Nissan", Model="Skyline", RokProdukcji = 1995, Przebieg = "144 000 km", Pojemnosc = "2 500 cm3", RodzajPaliwa= "benzyna", Moc = "410 KM", Opis="Na sprzedaż trafia moja perełka Nissan Skyline R33.Auto z Japonii sprowadzone do Szwecji, gdzie było przez wiele lat modyfikowane, uczestniczyło w zlotach, zdobywało nagrody, samochód sponsorowany latami przez Sonax Sweden.", Cena = 120000M, ZdjecieUrl="/images/nissan.jpg", MiniaturkaUrl="/images/nissan.jpg", JestSamochodemTygodnia = true},
                new Samochod { ID=6, Marka="Jaguar", Model="ZX", RokProdukcji = 2006, Przebieg = "78000 km", Pojemnosc = "5 000 cm3", RodzajPaliwa= "benzyna", Moc = "510 KM", Opis="Przedstawiam Państwu wyjątkowe auto jakim jest Jaguar XKR, a zwłaszcza ten egzemplarz. Jaguar XKR to ikona światowej i brytyjskiem motoryzacji, a przede wszystkim kontynuator legendarnego już Jaguara E-typa, przez wielu uważany za najpiękniejsze auto w historii motoryzacji.", Cena = 200000M, ZdjecieUrl="/images/jaguar.jpg", MiniaturkaUrl="/images/jaguar.jpg", JestSamochodemTygodnia = true}

            }
        }

        public Samochod PobierzSamochodOID(int samochodID)
        {
            return samochody.FirstOrDefault(s => s.ID == samochodID);
        }

        public IEnumerable<Samochod> PobierzWszystkieSamochody()
        {
            return samochody;
        }

teraz pytania:

  1. jak dzialaja interfejsy i Enumeratory?

  2. Co robi metoda PobierzSamochodOID w tym miejscu : (s => s.ID == samochodID) - skad to s i czemu s.ID, jak dziala ten operator =>

  3. Co robie metoda typu enumerable<samochod>PobierzWszystkieSamochody i skad te <> nawiasy, jak to dziala i czemu typu samochod

  4. Czemu klasa samochod zawiera same akcesory a nie posiada pol do ktorych by sie odwolywaly?

  5. Co to jest ten Mock

zwracam uwage ze kod moze byc nie pelny gdy jestem w trakcie przerabiania kursu i na razie go zatrzymalem dopoki dopoty nie zrozumiem co zostalo napisane

2
  1. Zgodnie z dokumentacją.
  2. To jest wyrażenie lambda.
  3. To z kolei jest związane z typami generycznymi.
  4. Bo są automatycznie generowane.

Odpowiedzi na swoje pytania znajdziesz w pierwszej lepszej książce albo nawet darmowym kursie.

3

IEnumerable

W IEnumerable chodzi o to, że pozwala to się "po czymś poruszać" np. zrobić na tym pętle foreach ale nie jest to konkretnie tablica lub lista.

Z IEnumerable możesz przejść na inny typ "pojemnikowy" typu lista lub tablica robiąc np. ToList()

Dodatkowo IEnumerable pozwala na użycie yield.

Co robi metoda PobierzSamochodOID w tym miejscu : (s => s.ID == samochodID) - skad to s i czemu s.ID

Chodzi o lambdy, które w tym przypadku pozwalają fajniej (krótszy, czytelniejszy kod) przeszukiwać jakieś kolekcje

np. masz listę liczb

var lista = new List<int>{1,2,3};

I chcesz wybrać wszystkie te liczby, które są większe od 1.

Mógłbyś to zrobić pętlą, ale to dość dużo kodu, więc możesz zrobić

lista.Where(s => s > 1)

Ok, ale dlaczego tam jest ten s?

s to jest jakby zmienna w tej lambdzie, na której operujesz, taka trochę abstrakcja jeżeli można tak powiedzieć :D

Dlaczego s.ID?

Gdybyś zamiast przeszukiwać kolekcję liczb (int) potrzebował przeszukać pod jakimś kątem kolekcję obiektów złożonych typu np. Samochód, który miałby właściwości / pola typu Prędkość / Cena

To musisz się do nich jakoś dobrać, więc robisz tą swoją zmienną w lambdzie s i mówisz, że chcesz szukać po np. cena s.Cena która np, jest większa niż 500

Where(s => s.Cena > 500)

I dostaniesz te samochody, których cena > 500.

skad te <> nawiasy

Chodzi o typy generyczne gdzie najprostszym przykład będzie List<typ>

Chcesz zrobić listę stringow? List<string>, Listę intów? List<int>, Listę samochodów? List<samochod> itd.

Czemu klasa samochod zawiera same akcesory a nie posiada pol do ktorych by sie odwolywaly?

public string Marka { get; set; }

To jest skrót na

private string _Marka;
public string Marka
{
    get
    {
        return this._Marka;
    }
    set
    {
        this._Marka = value;
    }
}
0

OK wyrazenia lamba pojalem, akcesory takze ale enumerable nie, jak by wygladaloby to .ToList()? Probowalem przeczytac nawet cos w necie ale nadal dla mnie to czarna magia.

Szukajac informacji na ten temat dotarlem do Interfejsow, korzystam z : http://kurs.aspnetmvc.pl/Csharp/Interfejsy
Ale mam dwa szybkie pytania, co to sa** Interfejsy bazowe** (wiem, pewnie zachacza to o dziedziczenie moze zaraz sam do tego dojde) i typy zagniezdzone, ktore sa tam wymienione?

edit
A wiec tak mamy interfejsy bazowe i dziedziczace, interfejs dziedziczacy to taki ktory dziedziczy metody po klasie/interfejsie bazowym, ktory jest jego rodzicem. Dobrze kojarze?

Metoda wirtualna - co to jest.

metoda abstrakcyjna - nie moze byc prywatna, musi byc publiczna, nie zawiera wlasnego ciala, wiec dlaczego, trzeba w ogole cos takiego tworzyc skoro i tak trzeba zdefiniowac jej cialo w klasie dziedziczacej?

tylko klasa abstrakcyjna, moze zawierac metody abstrakcyjne, po co to istnieje skoro mamy interfejsy?

Dziedziczenie, powiedzmy ze klasa z metoda override przyslania klase z metoda wirtualna, czy moge wywolac instancje klasy bazowej czy tylko dziedziczacej, i jak to wyglada

// pozwolcie ze zrobie sobie z tego topicu maly notatnik : )

1

A wiec tak mamy interfejsy bazowe i dziedziczace, interfejs dziedziczacy to taki ktory dziedziczy metody po klasie/interfejsie bazowym, ktory jest jego rodzicem. Dobrze kojarze?

Tak.

Metoda wirtualna - co to jest.

Metoda wirtualna to taka metoda, na której możesz zrobić override w klasie dziedziczącej. Czyli zrobić, że klasa dziedzicząca będzie mieć swoją własną implementację pewnej metody, która się będzie nieco inaczej zachowywać w stosunku do oryginalnej. Szukaj pod hasłem "polimorfizm". W niektórych językach programowania po prostu wszystkie metody są wirtualne i nie ma takiego rozróżnienia (np. Java).

metoda abstrakcyjna - nie moze byc prywatna, musi byc publiczna, nie zawiera wlasnego ciala, wiec dlaczego, trzeba w ogole cos takiego tworzyc skoro i tak trzeba zdefiniowac jej cialo w klasie dziedziczacej?
tylko klasa abstrakcyjna, moze zawierac metody abstrakcyjne, po co to istnieje skoro mamy interfejsy?

Interfejs to klasa czysto abstrakcyjna - tj. taka, której wszystkie metody są abstrakcyjne [1]. Ale czasami potrzebujesz stworzyć klasę, w której są pewne rzeczy, ale jedna/dwie/trzy pozostanie do implementacji w klasie dziedziczącej - i po to klasy abstrakcyjne.

Dodatkowo, można dziedziczyć tylko po jednej klasie abstrakcyjnej, ale implementować wiele interfejsów.

Dziedziczenie, powiedzmy ze klasa z metoda override przyslania klase z metoda wirtualna, czy moge wywolac instancje klasy bazowej czy tylko dziedziczacej, i jak to wyglada

Mówisz o takiej sytuacji?

class BaseClass
{
    public virtual void SomeMethod()
    {
        System.Console.WriteLine("Jestem base!");
    }
}

class DerivedClass : BaseClass
{
    public override void SomeMethod()
    {
        System.Console.WriteLine("Jestem derived!");
    }
}

To klasa dziedzicząca zawsze zachowuje się "po swojemu", nawet jeżeli zrzutujemy ją na klasę bazową - znów, polimorfizm.

class Program
{
    static void Main(string[] args)
    {
        var bc = new BaseClass();
        bc.SomeMethod();

        var dc = new DerivedClass();
        dc.SomeMethod();

        // ale!

        BaseClass bc2 = (dc as BaseClass);
        bc2.SomeMethod();
    }
}
E:\Marcin\Temp\App1>dotnet run
Jestem base!
Jestem derived!
Jestem derived!

[1] Od C# 8.0 dostępne są domyślne implementacje metod w interfejsach, więc to nie do końca prawda.

0

Polecam nauczyć się podstaw języka, zanim zaczniesz przerabiać ten kurs ASP.NET Core MVC. Jeszcze tydzień temu miałeś problemy z inicjalizacją tablicy, a już dziś przerabiasz ASP Core.

1 użytkowników online, w tym zalogowanych: 0, gości: 1