Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- //Program napisany najprościej jak się da bez dodatkowych funkcji ktore normalnie bym zrobil
- namespace Help_Program
- {
- #region Deklaracja klasy nadrzędnej która będzie polimorfizowana
- //Sposób numer jeden klasa abstrakcyjna (nie ma klasy wirtualnej w C#)
- abstract class Figura_Geometryczna_klasa
- {
- //Tworzymy takie metody które ma każda figura geometryczna
- abstract public void wpisz_wartosci(); // to bedzie nasz konstruktor
- abstract public double licz_pole(); // metoda abstrakcyjna jest pusta nie ma ciała , musi być publiczna
- abstract public double licz_obwod();
- virtual public string zwroc_nazwe() // metoda virtualna musi mieć ciało i być publiczna
- {
- return null; //null bo i tak nie mamy co zwrócić bo abstract klasa a i tak bedziemy robic override
- }
- virtual public string zwroc_nazwe_like_a_boss => null; // linq - wyrażenie lamba (metoda będzie traktowana jak zmienna)
- }
- //Sposób numer dwa interfejs (klasa z samymi metodami bez zmiennych) - dla chętnych dodatkowa wiedza a często używane
- interface Figura_Geometryczna_interfejs
- {
- double licz_pole(); //no to ogarniacie , ale bez praw dostepu bo domyślnie jest public i nie da się zmienic
- double licz_obwod();
- }
- #endregion
- #region Tworzymy klasy które będą używać klasy nadrzędnej
- //klasa będzie normalną zwykłą klasą tylko będzie dziedziczyć
- class Kolo : Figura_Geometryczna_klasa // operator dziedziczenia w C# to :
- {
- double promien; //klasa moze miec wlasne zmienne ktore nie byly deklarowane nigdzie wczesniej
- public Kolo() { } //można normalny konstruktor ale dla wygody aby fajnie wrzucac do tablic można robić tak
- //ale trzeba pamietac aby wywolac metode wpisz wartosci aby byly jakies wartosci inaczej wywali
- //klasa musi zawierać override funkcji z klasy nadrzędnej inaczej chuj z ideą polimorfizmu i brak kompilacji
- public override void wpisz_wartosci() //metoda musi mieć ten sam dostęp co overridowana
- {
- Console.WriteLine("Podaj promień: ");
- promien = Convert.ToDouble(Console.ReadLine()); //wczytywanie do zmiennej lepiej convert niż parse
- Console.Clear(); // czyszczenie konsoli
- }
- public override double licz_pole()
- {
- return (Math.PI*(Math.Pow(promien,2)));
- }
- public override double licz_obwod()
- {
- return (2 * Math.PI * promien);
- }
- public override string zwroc_nazwe()
- {
- return "Koło";
- }
- public override string zwroc_nazwe_like_a_boss
- {
- get
- {
- return "Koło";
- }
- }
- }
- class Kwadrat : Figura_Geometryczna_klasa
- {
- double bok;
- public Kwadrat() { }
- public override void wpisz_wartosci() //metoda musi mieć ten sam dostęp co overridowana
- {
- Console.WriteLine("Podaj długość boku ");
- bok = Convert.ToDouble(Console.ReadLine()); //wczytywanie do zmiennej lepiej convert niż parse
- Console.Clear(); // czyszczenie konsoli
- }
- public override double licz_pole()
- {
- return (Math.Pow(bok,2));
- }
- public override double licz_obwod()
- {
- return (4 * bok);
- }
- public override string zwroc_nazwe()
- {
- return "Kwadrat";
- }
- public override string zwroc_nazwe_like_a_boss
- {
- get
- {
- return "Kwadrat";
- }
- }
- }
- class Prostokat : Figura_Geometryczna_klasa
- {
- double bok_krotki,bok_dlugi;
- public Prostokat() { }
- public override void wpisz_wartosci() //metoda musi mieć ten sam dostęp co overridowana
- {
- Console.WriteLine("Podaj długość krótszego boku: ");
- bok_krotki = Convert.ToDouble(Console.ReadLine()); //wczytywanie do zmiennej lepiej convert niż parse
- Console.WriteLine("Podaj długość dłuższego boku: ");
- bok_dlugi = Convert.ToDouble(Console.ReadLine());
- Console.Clear(); // czyszczenie konsoli
- }
- public override double licz_pole()
- {
- return (bok_dlugi*bok_krotki);
- }
- public override double licz_obwod()
- {
- return (2*bok_dlugi+2*bok_krotki);
- }
- public override string zwroc_nazwe()
- {
- return "Prostokat";
- }
- public override string zwroc_nazwe_like_a_boss
- {
- get
- {
- return "Prostokat";
- }
- }
- }
- class Kwadrat_Interface : Figura_Geometryczna_interfejs // bonus
- {
- //tak samo jak wczesniej robimy sobie zmienne
- double bok;
- //tak samo ale bez override
- public double licz_pole()
- {
- return (Math.Pow(bok, 2));
- }
- public double licz_obwod()
- {
- return (4 * bok);
- }
- }
- #endregion
- class Program
- {
- static void Main(string[] args)
- {
- //Tworzymy zmienna ktora bedzie nam trzymac nasze figury (jak plecak w diablo)
- //Proces ten nazywamy zagnieżdżaniem klasy (Kompozycja)
- List<Figura_Geometryczna_klasa> plecak = new List<Figura_Geometryczna_klasa>(); //może być lista (pro)
- Figura_Geometryczna_klasa[] tornister; // może być tablica , ważne aby tworzyć obiekt klasy nadrzędnej
- //Czas aby włożyć coś do naszego plecaka
- plecak.Add(new Kolo());
- plecak.Add(new Kwadrat()); // dlatego że mamy taki konsruktor możemy zrobić to tak łatwo
- plecak.Add(new Prostokat()); // ale pamietac nalezy o wywołaniu metody wpisz wartosci
- //Analogicznie dla naszego tornistra
- tornister = new Figura_Geometryczna_klasa[3]; //specjalnie zrobiłem taką inicjalizacje można szybciej
- tornister[0] = new Kolo();
- tornister[1] = new Kwadrat();
- tornister[2] = new Prostokat();
- //zrobmy jakis program z naszymi klasami
- bool wybor = true;
- string figura_do_liczenia;
- while(wybor==true)
- {
- Console.WriteLine("Menu wyboru: \n ");
- foreach (var figura in plecak)
- {
- Console.WriteLine(figura.zwroc_nazwe()); //możemy tak zrobic bo mamy zrobiona funkcje ktora wypisze nazwy za nas
- }
- Console.WriteLine("\nCo chcesz policzyc?");
- figura_do_liczenia = Console.ReadLine().ToLower(); //ToLower aby litery były małe
- Console.Clear();
- //dla wygody zastosujemy funkcje switch
- switch(figura_do_liczenia)
- {
- case "koło":
- plecak[0].wpisz_wartosci(); //wywoływujemy nasz konstruktor
- Console.WriteLine("Pole koła: \n{0}", plecak[0].licz_pole());
- Console.WriteLine("Obwód koła: \n{0}",plecak[0].licz_obwod());
- break;
- case "kwadrat":
- plecak[1].wpisz_wartosci(); //wywoływujemy nasz konstruktor
- Console.WriteLine("Pole kwadratu: \n{0}", plecak[1].licz_pole());
- Console.WriteLine("Obwód kwadratu: \n{0}", plecak[1].licz_obwod());
- break;
- case "prostokąt":
- plecak[2].wpisz_wartosci(); //wywoływujemy nasz konstruktor
- Console.WriteLine("Pole prostokątu: \n{0}", plecak[2].licz_pole());
- Console.WriteLine("Obwód prostokątu: \n{0}", plecak[2].licz_obwod());
- break;
- default:
- Console.WriteLine("Cos nie tak");
- break;
- }
- Console.WriteLine("\nNacisnij dowolny klawisz aby kontynuować");
- Console.ReadLine();
- Console.Clear();
- }
- }
- }
- }
- /* Podsumowując może wydawać się że polimorfizm jest bezcelowy i za długi , ale pomyśl że chcesz dodać jeszcze
- * jedną figurę, zajmie to bardzo szybko. Polimorfizm daje naszej aplikacji możliwość bardzo szybkiej rozbudowy
- * programu. Zamiast figur mogą być postacie w naszej grze np. wojownik,paladyn, mag i chcemy dodać łotra
- * to zamiast pisać i pisać dodajemy tylko klasę łotr która ma swoje specyficzne metody i korzystamy już z wcześniej
- * napisanego kodu.
- */
Advertisement
Add Comment
Please, Sign In to add comment