isotonicq

Polimorfizm/Dziedziczenie nieudolny poradnik

Nov 5th, 2016
156
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. //Program napisany najprościej jak się da bez dodatkowych funkcji ktore normalnie bym zrobil
  8.  
  9. namespace Help_Program
  10. {
  11.     #region Deklaracja klasy nadrzędnej która będzie polimorfizowana
  12.  
  13.     //Sposób numer jeden klasa abstrakcyjna (nie ma klasy wirtualnej w C#)
  14.     abstract class Figura_Geometryczna_klasa
  15.     {
  16.         //Tworzymy takie metody które ma każda figura geometryczna
  17.         abstract public void wpisz_wartosci(); // to bedzie nasz konstruktor
  18.         abstract public double licz_pole(); // metoda abstrakcyjna jest pusta nie ma ciała , musi być publiczna
  19.         abstract public double licz_obwod();
  20.  
  21.         virtual public string zwroc_nazwe() // metoda virtualna musi mieć ciało i być publiczna
  22.         {
  23.             return null; //null bo i tak nie mamy co zwrócić bo abstract klasa a i tak bedziemy robic override
  24.         }
  25.  
  26.         virtual public string zwroc_nazwe_like_a_boss => null; // linq - wyrażenie lamba (metoda będzie traktowana jak zmienna)
  27.     }
  28.  
  29.     //Sposób numer dwa interfejs (klasa z samymi metodami bez zmiennych) - dla chętnych dodatkowa wiedza a często używane
  30.     interface Figura_Geometryczna_interfejs
  31.     {
  32.         double licz_pole(); //no to ogarniacie , ale bez praw dostepu bo domyślnie jest public i nie da się zmienic
  33.         double licz_obwod();
  34.     }
  35.     #endregion
  36.  
  37.     #region Tworzymy klasy które będą używać klasy nadrzędnej
  38.  
  39.     //klasa będzie normalną zwykłą klasą tylko będzie dziedziczyć
  40.     class Kolo : Figura_Geometryczna_klasa // operator dziedziczenia w C# to :
  41.     {
  42.         double promien; //klasa moze miec wlasne zmienne ktore nie byly deklarowane nigdzie wczesniej
  43.  
  44.         public Kolo() { } //można normalny konstruktor ale dla wygody aby fajnie wrzucac do tablic można robić tak
  45.                           //ale trzeba pamietac aby wywolac metode wpisz wartosci aby byly jakies wartosci inaczej wywali
  46.          
  47.         //klasa musi zawierać override funkcji z klasy nadrzędnej inaczej chuj z ideą polimorfizmu i brak kompilacji
  48.         public override void wpisz_wartosci() //metoda musi mieć ten sam dostęp co overridowana
  49.         {
  50.             Console.WriteLine("Podaj promień: ");
  51.             promien = Convert.ToDouble(Console.ReadLine()); //wczytywanie do zmiennej lepiej convert niż parse
  52.             Console.Clear(); // czyszczenie konsoli
  53.         }
  54.  
  55.         public override double licz_pole()
  56.         {
  57.             return (Math.PI*(Math.Pow(promien,2)));
  58.         }
  59.  
  60.         public override double licz_obwod()
  61.         {
  62.             return (2 * Math.PI * promien);
  63.         }
  64.  
  65.         public override string zwroc_nazwe()
  66.         {
  67.             return "Koło";
  68.         }
  69.  
  70.         public override string zwroc_nazwe_like_a_boss
  71.         {
  72.             get
  73.             {
  74.                 return "Koło";
  75.             }
  76.         }
  77.     }
  78.  
  79.     class Kwadrat : Figura_Geometryczna_klasa
  80.     {
  81.         double bok;
  82.  
  83.         public Kwadrat() { }
  84.  
  85.         public override void wpisz_wartosci() //metoda musi mieć ten sam dostęp co overridowana
  86.         {
  87.             Console.WriteLine("Podaj długość boku ");
  88.             bok = Convert.ToDouble(Console.ReadLine()); //wczytywanie do zmiennej lepiej convert niż parse
  89.             Console.Clear(); // czyszczenie konsoli
  90.         }
  91.  
  92.         public override double licz_pole()
  93.         {
  94.             return (Math.Pow(bok,2));
  95.         }
  96.  
  97.         public override double licz_obwod()
  98.         {
  99.             return (4 * bok);
  100.         }
  101.  
  102.         public override string zwroc_nazwe()
  103.         {
  104.             return "Kwadrat";
  105.         }
  106.  
  107.         public override string zwroc_nazwe_like_a_boss
  108.         {
  109.             get
  110.             {
  111.                 return "Kwadrat";
  112.             }
  113.         }
  114.  
  115.     }
  116.  
  117.     class Prostokat : Figura_Geometryczna_klasa
  118.     {
  119.         double bok_krotki,bok_dlugi;
  120.  
  121.         public Prostokat() { }
  122.  
  123.         public override void wpisz_wartosci() //metoda musi mieć ten sam dostęp co overridowana
  124.         {
  125.             Console.WriteLine("Podaj długość krótszego boku: ");
  126.             bok_krotki = Convert.ToDouble(Console.ReadLine()); //wczytywanie do zmiennej lepiej convert niż parse
  127.             Console.WriteLine("Podaj długość dłuższego boku: ");
  128.             bok_dlugi = Convert.ToDouble(Console.ReadLine());
  129.             Console.Clear(); // czyszczenie konsoli
  130.         }
  131.  
  132.         public override double licz_pole()
  133.         {
  134.             return (bok_dlugi*bok_krotki);
  135.         }
  136.  
  137.         public override double licz_obwod()
  138.         {
  139.             return (2*bok_dlugi+2*bok_krotki);
  140.         }
  141.  
  142.         public override string zwroc_nazwe()
  143.         {
  144.             return "Prostokat";
  145.         }
  146.  
  147.         public override string zwroc_nazwe_like_a_boss
  148.         {
  149.             get
  150.             {
  151.                 return "Prostokat";
  152.             }
  153.         }
  154.  
  155.     }
  156.  
  157.     class Kwadrat_Interface : Figura_Geometryczna_interfejs // bonus
  158.     {
  159.         //tak samo jak wczesniej robimy sobie zmienne
  160.         double bok;
  161.  
  162.         //tak samo ale bez override
  163.         public double licz_pole()
  164.         {
  165.             return (Math.Pow(bok, 2));
  166.         }
  167.  
  168.         public double licz_obwod()
  169.         {
  170.             return (4 * bok);
  171.         }
  172.     }
  173.  
  174.     #endregion
  175.  
  176.     class Program
  177.     {
  178.         static void Main(string[] args)
  179.         {
  180.             //Tworzymy zmienna ktora bedzie nam trzymac nasze figury (jak plecak w diablo)
  181.             //Proces ten nazywamy zagnieżdżaniem klasy (Kompozycja)
  182.             List<Figura_Geometryczna_klasa> plecak = new List<Figura_Geometryczna_klasa>(); //może być lista (pro)
  183.             Figura_Geometryczna_klasa[] tornister; // może być tablica , ważne aby tworzyć obiekt klasy nadrzędnej
  184.  
  185.             //Czas aby włożyć coś do naszego plecaka
  186.             plecak.Add(new Kolo());
  187.             plecak.Add(new Kwadrat()); // dlatego że mamy taki konsruktor możemy zrobić to tak łatwo
  188.             plecak.Add(new Prostokat()); // ale pamietac nalezy o wywołaniu metody wpisz wartosci
  189.  
  190.             //Analogicznie dla naszego tornistra
  191.             tornister = new Figura_Geometryczna_klasa[3]; //specjalnie zrobiłem taką inicjalizacje można szybciej
  192.             tornister[0] = new Kolo();
  193.             tornister[1] = new Kwadrat();
  194.             tornister[2] = new Prostokat();
  195.  
  196.             //zrobmy jakis program z naszymi klasami
  197.  
  198.             bool wybor = true;
  199.             string figura_do_liczenia;
  200.  
  201.             while(wybor==true)
  202.             {
  203.                 Console.WriteLine("Menu wyboru: \n ");
  204.  
  205.                 foreach (var figura in plecak)
  206.                 {
  207.                     Console.WriteLine(figura.zwroc_nazwe()); //możemy tak zrobic bo mamy zrobiona funkcje ktora wypisze nazwy za nas                
  208.                 }
  209.  
  210.                 Console.WriteLine("\nCo chcesz policzyc?");
  211.                 figura_do_liczenia = Console.ReadLine().ToLower(); //ToLower aby litery były małe
  212.                 Console.Clear();
  213.  
  214.                 //dla wygody zastosujemy funkcje switch
  215.  
  216.                 switch(figura_do_liczenia)
  217.                 {
  218.                     case "koło":
  219.                         plecak[0].wpisz_wartosci(); //wywoływujemy nasz konstruktor
  220.                         Console.WriteLine("Pole koła: \n{0}", plecak[0].licz_pole());
  221.                         Console.WriteLine("Obwód koła: \n{0}",plecak[0].licz_obwod());
  222.                         break;
  223.  
  224.                     case "kwadrat":
  225.                         plecak[1].wpisz_wartosci(); //wywoływujemy nasz konstruktor
  226.                         Console.WriteLine("Pole kwadratu: \n{0}", plecak[1].licz_pole());
  227.                         Console.WriteLine("Obwód kwadratu: \n{0}", plecak[1].licz_obwod());
  228.                         break;
  229.  
  230.                     case "prostokąt":
  231.                         plecak[2].wpisz_wartosci(); //wywoływujemy nasz konstruktor
  232.                         Console.WriteLine("Pole prostokątu: \n{0}", plecak[2].licz_pole());
  233.                         Console.WriteLine("Obwód prostokątu: \n{0}", plecak[2].licz_obwod());
  234.                         break;
  235.  
  236.                     default:
  237.                         Console.WriteLine("Cos nie tak");
  238.                         break;
  239.                 }
  240.                 Console.WriteLine("\nNacisnij dowolny klawisz aby kontynuować");
  241.                 Console.ReadLine();
  242.                 Console.Clear();
  243.             }
  244.         }
  245.     }
  246. }
  247.  
  248. /* Podsumowując może wydawać się że polimorfizm jest bezcelowy i za długi , ale pomyśl że chcesz dodać jeszcze
  249.  * jedną figurę, zajmie to bardzo szybko. Polimorfizm daje naszej aplikacji możliwość bardzo szybkiej rozbudowy
  250.  * programu. Zamiast figur mogą być postacie w naszej grze np. wojownik,paladyn, mag i chcemy dodać łotra
  251.  * to zamiast pisać i pisać dodajemy tylko klasę łotr która ma swoje specyficzne metody i korzystamy już z wcześniej
  252.  * napisanego kodu.
  253.  */
RAW Paste Data