IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Implementace rozhraní - kompilátor úloh neakceptuje správná řešení

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Michal Sáraz:28.2.2022 23:30

Zdravím, obracím se tu na vás s prosbou. Řeším teď úlohy k 14.-16. lekci OOP a zasekl jsem se na jednoduchém příkladu. Dal jsem dohromady několik různých řešení, která mi fungují na mém IDE, nicméně neprojdou kompilátorem úloh. Když ve třídě Objednávka zkouším implementovat rozhraní IOrder, nejsou akceptovány ani lambda výrazy, ani samotný {get; }. V diskuzi pod lekcí bylo zmíněno, že skript pro vyhodnocování cvičení přijímá pouze řešení s "private set" a, že vlastnosti se musí rozepsat na return. To jsem udělal a stejně mi to hází, že to není správně. Už nevím, co udělat jinak. Podíval bych se do vzorového řešení, ale nechce se mi ho stahovat dříve, než já odevzdám to své (abych neměl zaznamenáno, že řešení bylo odkryto). Zkoušel jsem psát i přímo do diskuze pod cvičením, ale zatím na to ani po několika dnech nikdo nereagoval. Předem díky za jakoukoliv pomoc!

Zkusil jsem: IOrder:

interface IOrder
{
    int Number { get; }
    /// <summary>
    /// Customer first name
    /// </summary>
    string FirstName { get; }
    /// <summary>
    /// Customer last name
    /// </summary>
    string LastName { get; }
    /// <summary>
    /// Street
    /// </summary>
    string Street { get; }
    /// <summary>
    /// House number
    /// </summary>
    int HouseNumber { get; }
    /// <summary>
    /// Registry number
    /// </summary>
    int RegistryNumber { get; }
    /// <summary>
    /// City
    /// </summary>
    string City { get; }
    /// <summary>
    /// Zip code
    /// </summary>
    string Zip { get; }
    /// <summary>
    /// Country
    /// </summary>
    string Country { get; }
    /// <summary>
    /// Product names
    /// </summary>
    string[] Products { get; }
    /// <summary>
    /// Product quantities
    /// </summary>
    int[] Quantities { get; }
    /// <summary>
    /// Product prices
    /// </summary>
    double[] Prices { get; }
}

Objednávka:

class Objednavka : IOrder
{
    private Adresa fakturacni;
    private Adresa dodaci;
    private Zakaznik zakaznik;
    private List<Produkt> kosik;
    public int Cislo { get; init; }
    private static int dalsiCislo = 1;
    string[] nazvy;
    int[] pocty;
    double[] ceny;

    public Objednavka (Produkt produkt, Zakaznik zakaznik, Adresa fakturacni, Adresa dodaci, List<Produkt> kosik)
    {
        Cislo = dalsiCislo;
        Number = Cislo;
        this.zakaznik = zakaznik;
        this.fakturacni = fakturacni;
        this.dodaci = dodaci;
        this.kosik = kosik;
        dalsiCislo++;
    }
    public void PrejitDoKosiku(List<Produkt> kosik)
    {
        int i = 0;
        nazvy = new string[kosik.Count];
        pocty = new int[kosik.Count];
        ceny = new double[kosik.Count];

        foreach (Produkt polozka in kosik)
        {
            nazvy[i] = polozka.Nazev;
            pocty[i] = polozka.Pocet;
            ceny[i] = polozka.Cena;
            i++;
        }
    }


    public int Number
    {
        get
        {
            return Cislo;
        }
        private set
        {}
    }

    public string FirstName
    {
        get
        {
            return zakaznik.Jmeno;
        }
        private set
        { }
    }

    public string LastName
    {
        get
        {
            return zakaznik.Prijmeni;
        }
        private set
        { }
    }

    public string Street
    {
        get
        {
            return fakturacni.Ulice;
        }
        private set
        { }
    }

    public int HouseNumber
    {
        get
        {
            return fakturacni.CisloPopisne;
        }
        private set
        { }
    }

    public int RegistryNumber
    {
        get
        {
            return fakturacni.CisloOrientacni;
        }
        private set
        { }
    }

    public string City
    {
        get
        {
            return fakturacni.Mesto;
        }
        private set
        { }
    }

    public string Zip
    {
        get
        {
            return fakturacni.PSC;
        }
        private set
        { }
    }

    public string Country
    {
        get
        {
            return "Česká republika";
        }
        private set
        { }
    }

    public string[] Products
    {
        get
        {
            return nazvy;
        }
        private set
        { }
    }

    public int[] Quantities
    {
        get
        {
            return pocty;
        }
        private set
        { }
    }

    public double[] Prices
    {
        get
        {
            return ceny;
        }
        private set
        { }
    }
}

Produkt:

class Produkt
{
    public string Nazev { get; set; }
    public string Popis { get; set; }
    public int Pocet { get; set; }
    public int Cena { get; set; }

    public Produkt (string nazev, string popis, int pocet, int cena)
    {
        Nazev = nazev;
        Popis = popis;
        Pocet = pocet;
        Cena = cena;
    }
    public Produkt()
    {}

    public void PridejDoKosiku(List<Produkt> kosik, string Nazev, string Popis, int Pocet, int Cena)
    {
        kosik.Add(new Produkt(Nazev, Popis, Pocet, Cena));
    }
}

Zakaznik:

class Zakaznik
{
    public string Jmeno { get; set; }
    public string Prijmeni { get; set; }

    public Zakaznik (string jmeno, string prijmeni)
    {
        Jmeno = jmeno;
        Prijmeni = prijmeni;
    }
}

Gateway:

class Gateway
{
    /// <summary>
    /// Metoda simuluje zpracování objednávky, zde pouze vypsáním do konzole. Důležité je, že díky dodržení
    /// rozhraní od vývojářů platební brány umí brána pracovat s naší objednávkou, i když naši třídu nikdy
    /// neviděli.
    /// </summary>
    /// <param name="order">Objednávka implementující rozhraní IOrder</param>
    public void ProcessOrder(IOrder order)
    {
        Console.WriteLine("Order no. {0}", order.Number);
        Console.WriteLine("=============");
        Console.WriteLine("Name:    {0} {1}", order.FirstName, order.LastName);
        Console.WriteLine("Address: {0} {1}/{2}", order.Street, order.HouseNumber, order.RegistryNumber);
        Console.WriteLine("         {0} {1}", order.City, order.Zip);
        Console.WriteLine("         {0}", order.Country);
        Console.WriteLine();
        for (int i = 0; i < order.Products.Length; i++)
        {
            Console.WriteLine("{0} {1}pcs per {2},-", order.Products[i], order.Quantities[i], order.Prices[i]);
        }
        Console.WriteLine();
        Console.WriteLine("Total price: {0},-", order.Prices.Sum());
    }
}

Program:

class Program
{
    static void Main(string[] args)
    {
        Zakaznik zakaznik = new Zakaznik("Tomáš", "Marný");
        Adresa fakturacni = new Adresa("Ve Svahu", 10, 2, "Praha", "10000");
        Adresa dodaci = new Adresa("Šikmá", 11, 3, "Praha", "11000");

        Produkt nakup = new Produkt();
        List<Produkt> kosik = new List<Produkt>();
        nakup.PridejDoKosiku(kosik, "Body pro ITnetwork.cz", "Body pro zpřístupnění prémiového obsahu a dosažení vašeho vysněného zaměstnání v IT.", 1, 239);

        Objednavka objednavka = new Objednavka(nakup, zakaznik, fakturacni, dodaci, kosik);
        objednavka.PrejitDoKosiku(kosik);

        // Vytvoření brány a předání objednávky bráně
        Gateway brana = new Gateway();
        brana.ProcessOrder(objednavka);

        Console.ReadKey();
    }
}
 
Odpovědět
28.2.2022 23:30
Avatar
JerryM
Člen
Avatar
JerryM:7.3.2022 8:01

uplně nerozumim tomu, co chceš .. property je interface běžná věc
https://docs.microsoft.com/…e-properties
tak zkus nezadávat/zadat nebo nezadat return do get a nebo to nech upplněprázdný

 
Nahoru Odpovědět
7.3.2022 8:01
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.