Dziedziczenie i wywoływanie metod innych klas

0

Witam,
A więc jestem początkujący i dopiero rozpoczynam naukę C# jak i programowania mam do zrobienia na studia projekt zaliczeniowy niestety mam klika problemów na które ciężko znaleźć mi odpowiedzi a może znalazłem tylko potrzebuję łopatologicznego wytłumaczenia.

Problem 1 - Mam Klasę Kategoria która dziedziczy z klasy Danie (chodzi o to że są kategorie dań typu zupa przystawki etc a w klasie Danie znajdują się wszystkie dania )
niestety bo zrobieniu konstruktora w klasie Danie klasa Kategoria ma jakiś problem z odziedziczeniem klasy Danie a chciałem tak zrobić żeby w klasie Kategoria mieć dostęp do funkcji wyświetlenia listy dań ale chyba się tak nie da ?
Problem KLasy1.PNG
Problem KLasy2.PNG

Problem 2 - Nie jestem pewien ale czy tworzenie obiektu np. (obiektu Menu) w klasie Aplikacja w celu wywołania funkcji WybierzKategorie() jest rozsądne ? Bo chyba nie.

Problem KLasy3.PNG
Problem KLasy4.PNG

Zdjęcia poglądowo w czym problem prawdopodobnie to jakiś głupi błąd a na pewno nie wiedza autora.

Proszę o pomoc bo głowię się nad tym i nie bardzo wiem jak to dobrze zrobić.

2

Problem 1 - Mam Klasę Kategoria która dziedziczy z klasy Danie (chodzi o to że są kategorie dań typu zupa przystawki etc a w klasie Danie znajdują się wszystkie dania )

@ZrobieDobrze: coś dla ciebie

Zdjęcia poglądowo w czym problem prawdopodobnie to jakiś głupi błąd a na pewno nie wiedza autora.

W sensie to jest żart czy na poważnie?


Po kolej:

  1. Mam Klasę Kategoria która dziedziczy z klasy Danie - Ale gdzie tu widzisz miejsce na dziedziczenie? W Jaki sposób taka dajmy na to zupa ma dziedziczyć po ogórkowej? Chyba mocno dziedziczenia nie rozumiesz
  2. klasie Danie znajdują się wszystkie dania - czy to nie brzmi ci w ogóle źlę? Jeśli w klasie znajdują się wszystkie dania To klasa powinna się nazywać WszystkieDania (albo menu, ale to dla zaawansowanych) a nie Danie. Teraz każde danie zawiera się w każdym daniu i to prowadzi do błędu kompilacji u mnie w głowie :(
3
Koniu Senpai napisał(a):

Problem 1 - Mam Klasę Kategoria która dziedziczy z klasy Danie (chodzi o to że są kategorie dań typu zupa przystawki etc a w klasie Danie znajdują się wszystkie dania )

reszty nie będę omawiał (byłaby jatka, a chwilowo mam dobry nastrój)
Fakt, masz problem.

Dziedziczenie, to relacja "jest", Jabłko jest Owocem itd
Ale Jabłko nie jest KoszykiemJabłek, ani KoszykJabłek nie jest Jabłkiem

podobny antyprzykład:
class Student : Krzesło {

Wróć do wykładu, ksiazki. Pomedytuj w jakiej sytuacji tam mówią o dziedziczeniu, i czym się jednak różni od twojej propozycji.

Znaj moje dobre serce (he he, @KamilAdam dzięki za zaproszenie) i za darmo, bez faktury VAT, podrzucę Ci dwa sposoby myślenia *)

  • Potrawa posiada Kategorię (każdy obuiekt Potrawa ma referencję do jednej Kategorii), do jakiej należy
  • Kategoria jest zbiorem Potraw (kolekcją, np Listą)

Związek miedzy nimi jakiś jest, czujesz? Ale nie jest to związek dziedziczenia.

Zaden z tych sposobów myślenia nie zrobi ci wielkiej krzywdy, oba **)są całkiem spoko jak na studenta (choć zawodowcy i słusznie, mogą po mnie trochę pojeżdzić)

*) jakie jest zadanie ?
**) sugeruję tylko jeden z nich, polegniesz na realizacji obu jednocześnie

0

"Zdjęcia poglądowo w czym problem prawdopodobnie to jakiś głupi błąd, a na pewno nie-wiedza autora" - Źle to ubrałem w słowa można źle zrozumieć.

No nic dzięki za szybką odpowiedź trochę mi temat się rozjaśnił, przynajmniej wiem że cała koncepcja jaką stworzyłem w głowie jest błędna spróbuję mocno się do edukować z tematu dziedziczenia i klas .
Konstruktywna krytyka jest jak najbardziej wskazana w tym wypadku dzięki wielkie :)
pzodrawiam.

3
Koniu Senpai napisał(a):

spróbuję mocno się do edukować z tematu dziedziczenia i klas .

Akurat clou wiedzy z dziedziny dziedziczenia jest: nie dziedziczyć, chyba że są istotne powody.

Chyba 90% przypadków, kiedy początkujący myśli o dziedziczeniu, to w rzeczywistości myśli kompozycji: Student posiada Krzesło. Jest to dziwne, bo w życiu masowo występuje kompozycja (=posiada), o wiele częściej niż dziedziczenie (systematyka u biologów)

0

Czy to jest rekurencyjna klasa? Bo masz klasę Danie, która ma metody typu Wyswietl_zupy() i każda taka metoda tworzy listę obiektów Danie np.

List<Danie> listaPrzystawki = new List<Danie>()

Czy ta rekurencja tu ma jakikolwiek sens tutaj? (tworzymy obiekt Danie, który jest pojemnikiem na listę obiektów Danie?) To może mieć czasem sens, ale tu wydaje mi się, że została wrzucona przez przypadek)

Plus ta zmienna się nazywa w każdej metodzie listaPrzystawki nawet jeśli to lista zup albo lista deserów...

No i co dalej robisz z tą zmienną. Tworzysz ją w tej metodzie i nic z nią nie robisz?

0

A tak z innej beczki bo chyba doszedłem do gł. powodu całego tego bagałanu. Zadam kolejne głupie pytanie bo już gorzej być nie może :D

Czy jest ktoś w stanie podesłać jakiś krótki kod z programem który ma z 2 ,3 klasy w nich metody żebym sobie zobaczył jak funkcja main otrzymuje dane metody z klas etc ?

2

Skoro doszedłeś do gł. powodu całego tego bałaganu, to resztę sam powinieneś sobie łatwo opracować, no chyba że kłamiesz ...

0
_13th_Dragon napisał(a):

Skoro doszedłeś do gł. powodu całego tego bałaganu, to resztę sam powinieneś sobie łatwo opracować, no chyba że kłamiesz ...

Doszedłem do wniosku żeby tworzyć funkcje statyczne w klasie program i te funkcje statyczne będą tworzyć obiekty klas dzięki czemu bez problemu wykorzystam funkcje i metody klas i to połączę na swój sposób nie wiem czy dobrze kombinuje i czy jest jakaś poprawa hmm? Proszę krytykować dalej :D

CzyLepiej.PNG

1

@Koniu Senpai:

Straszne.
I jeszcze śmiesz to nazywać obiektowe ?
(Zapraszam @KamilAdam na ocenę obiektówki ;) )

Miotasz się, zupełnie sam nie rozumiesz, co piszesz.

Moze naprawdę coś poczytać, popatrzyć na jakiś lepszy kod ?

Aż widać jak ci pot kapie z czoła ... ale niestety, trafiłeś kulą w płot.

1

Postanowiłem przećwiczyć pe podejscie:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SmartMenu
{
    internal class Context
    {
        public Cafe cafe { get; set; }
        public Order order { get; set; }
        public Dish dish { get; set; }
        public Context combine(Context extra)
        {
            return (extra == null) ? this : new Context
            {
                cafe = (extra.cafe ?? cafe),
                order = (extra.order ?? order),
                dish = (extra.dish ?? dish)
            };
        }
        public Context combine(Order order)
        {
            return new Context
            {
                cafe = cafe,
                order = (order ?? this.order),
                dish = dish
            };
        }
        public Context combine(Dish dish)
        {
            return new Context
            {
                cafe = cafe,
                order = order,
                dish = (dish ?? this.dish)
            };
        }
    }

    internal class Cafe
    {
        private static readonly UserMenu[] orderMenu = new UserMenu[]
        {
            new UserMenu("Pokaż zamówienie",Order.ShowOrder),
            new UserMenu("Dodaj danie",Dish.makeCategoryMenu(Order.AddDish)),
            new UserMenu("Rozlicz",Cafe.CompleteOrder),
            UserMenu.returnMenu,
        };
        public static readonly UserMenu[] mainMenu = new UserMenu[]
        {
            new UserMenu("Nowe zamówienie",Cafe.MakeOrder),
            new UserMenu("Wybierz zamówienie",Cafe.ChoiseOrder),
            new UserMenu("Koniec programu"),
        };
        private readonly List<Order> orders = new List<Order>();
        public static bool MakeOrder(string title, Context context)
        {
            Console.WriteLine(title);
            Console.Write("Podaj id: ");
            string id = Console.ReadLine();
            string subtitle = $"{title} / zamówienie {id}";
            foreach (Order ord in context.cafe.orders)
            {
                if (ord.id == id)
                {
                    Console.WriteLine($"Znaleziono zamówienie {id}");
                    Console.WriteLine();
                    UserMenu.Run(subtitle, orderMenu, context.combine(ord));
                    return true;
                }
            }
            Console.WriteLine($"Utworzono zamówienie {id}");
            Console.WriteLine();
            Order order = new Order(id);
            context.cafe.orders.Add(order);
            UserMenu.Run(subtitle, orderMenu, context.combine(order));
            return true;
        }
        public static bool ChoiseOrder(string title, Context context)
        {
            UserMenu[] menu =
                context.cafe.orders
                .OrderBy(order => order.id)
                .Select(order => new UserMenu(order.id, orderMenu, context.combine(order)))
                .Append(UserMenu.returnMenu)
                .ToArray()
            ;
            UserMenu.Run(title, menu.ToArray(), context);
            return true;
        }
        public static bool CompleteOrder(string title, Context context)
        {
            Console.WriteLine(title);
            Order.ShowOrder($"Zamówienie {context.order.id}", context);
            context.cafe.orders.Remove(context.order);
            return false;
        }
        public static string ShowPrice(int price)
        {
            return string.Format("{0:###0.00}", price / 100.0);
        }
    }

    internal class Order
    {
        private readonly List<Dish> dishes = new List<Dish>();
        public string id { get; private set; }
        public Order(string id) { this.id = id; }
        public static bool AddDish(string Title, Context context)
        {
            Console.WriteLine(Title);
            context.order.dishes.Add(context.dish);
            Console.WriteLine($"Do zamówienia {context.order.id} dodano danie {context.dish.category}:{context.dish.title} - {Cafe.ShowPrice(context.dish.price)}");
            return true;
        }
        public static bool ShowOrder(string title, Context context)
        {
            Console.WriteLine(title);
            if(context.order.dishes.Count <= 0) Console.WriteLine("Zamówienie puste");
            else
            {
                foreach(Dish dish in context.order.dishes)
                {
                    Console.WriteLine(dish.Show());
                }
                Console.WriteLine($"razem: {Cafe.ShowPrice(context.order.Sum()).Trim()}");
            }
            return true;
        }
        public int Sum()
        {
            return
                dishes
                .Aggregate(0, (curr, dish) => (curr + dish.price))
            ;
        }
    }

    internal class Dish
    {
        private static readonly List<Dish> dishes = new List<Dish>()
        {
            new Dish("Przystawki","Pajda",999),
            new Dish("Przystawki","Koreczki",1199),
            new Dish("Zupy","Ogórkowa",2399),
            new Dish("Zupy","Pomidorowa",2199),
            new Dish("Dania główne","Schabowy",3499),
            new Dish("Dania główne","Pierogi",1799),
        };
        public static UserMenu[] makeCategoryMenu(UserMenuExecuter executer)
        {
            return
                dishes
                .Select(dish => dish.category)
                .Distinct()
                .OrderBy(category => category)
                .Select(category => new UserMenu(category, makeDishMenu(category, executer)))
                .Append(UserMenu.returnMenu)
                .ToArray()
            ;
        }
        private static UserMenu[] makeDishMenu(string category, UserMenuExecuter executer)
        {
            return
                dishes
                .Where(dish => (dish.category == category))
                .OrderBy(dish => dish.title)
                .Select(dish => new UserMenu(dish.title, executer, new Context { dish = dish }))
                .Append(UserMenu.returnMenu)
                .ToArray()
            ;
        }
        public string category { get; private set; }
        public string title { get; private set; }
        public int price { get; private set; }
        private Dish(string category, string title, int price)
        {
            this.category = category;
            this.title = title;
            this.price = price;
        }
        public string Show()
        {
            return $"{Cafe.ShowPrice(price)} \t{category}:{title}";
        }
    }

    internal delegate bool UserMenuExecuter(string title, Context context);

    internal class UserMenu
    {
        public static readonly UserMenu returnMenu = new UserMenu("Powrót");
        private readonly String name;
        private readonly UserMenuExecuter executer;
        private readonly UserMenu[] submenu;
        private readonly Context context;
        private UserMenu(String name, UserMenuExecuter executer, UserMenu[] submenu, Context context)
        {
            this.name = name;
            this.executer = executer;
            this.submenu = submenu;
            this.context = context;
        }
        public UserMenu(String name, UserMenuExecuter executer, Context context = null) : this(name, executer, null, context) { }
        public UserMenu(String name, UserMenu[] submenu, Context context = null) : this(name, null, submenu, context) { }
        public UserMenu(String name) : this(name, null, null, null) { }
        public static void Run(String title, UserMenu[] submenu, Context context = null)
        {
            while (true)
            {
                Console.WriteLine($"* {title}:");
                for (int i = 0; i < submenu.Length; ++i) Console.WriteLine($"{i + 1}. {submenu[i].name}");
                Console.Write("Wybierz opcję: ");
                if (!int.TryParse(Console.ReadLine(), out int pos)) pos = -1;
                if ((1 <= pos) && (pos <= submenu.Length))
                {
                    UserMenu sub = submenu[pos - 1];
                    string subtitle = $"{title} * {sub.name}";
                    Context subcontext = context.combine(sub.context);
                    if (sub.submenu != null)
                    {
                        Run(subtitle, sub.submenu, subcontext);
                    }
                    else if (sub.executer != null)
                    {
                        if(!sub.executer(subtitle, subcontext)) break;
                    }
                    else break;
                }
                else Console.WriteLine("Nie ma takiej opcji");
                Console.WriteLine();
            }
        }
    }
    internal class Program
    {
        static void Main()
        {
            UserMenu.Run("Menu główne", Cafe.mainMenu, new Context { cafe = new Cafe() });
        }
    }
}
0

Bardzo przydatne właśnie chodziło mi o coś takiego gdzie zobaczę dokładnie jak ktoś pracuje z kodem i jak to robi porządnie dzięki wielkie Panie smoku :)

1
ZrobieDobrze napisał(a):

Dziedziczenie, to relacja "jest", Jabłko jest Owocem itd
Ale Jabłko nie jest KoszykiemJabłek, ani KoszykJabłek nie jest Jabłkiem

Bzdura. Dziedziczenie to tylko ponowna i niejawna deklaracja pól, metod i konstruktora w pod-klasie.

Te relacje jak "is-a" to romantyczne wyobrażenie. Im dłużej myślisz o obiektach w taki sposób, tym częściej będziesz pisał shitowy kod.

1

@Riddle:

wytłumacz człowiekowi na jego poziomie

0

Albo lepiej zrobic jedna klase i tyle, po co to dziewiczyć ciągle? i tak wszystko po kompilacji jest jak jeden dlugi plik xD

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