static void Implementowanie_Interferjsu_W_Sposób_Niejawny() { /* Jest to raczej nieprawidłowe zachowanie. Powinno się implementować w sposób jawny a w szczególności gdy nazwa metody się powtarza. * Klasa 'Kula' implementuje interfejs 'IRuch' oraz 'IOblicz' w sposób niejawny, przez co zawiera jedną implementacje metody 'ObliczDystandDo()' lecz definicja tej metody * znajduje się w obydwóch interfejsach. Domyślnie język C# nie dokonuje rozrożnienia, który interfejs jest implementowany przez daną metode. */ Kula kula = new Kula(); kula.ObliczDystansDo(new Kula()); IOblicz obliczKula = kula; obliczKula.ObliczDystansDo(new Kula()); IRuch ruchKuli = kula; ruchKuli.ObliczDystansDo(new Kula()); }
static void Klasy_Abstrakcyjne() { /* Gdy kod się powtarza jednym z rozwiązań jest utworzenie klasy bazowej i umieszczenie w niej wspólnej implementacji. */ Bryla bryla = new Bryla(); //Błąd kompilacji Bryla kula = new Kula(); Bryla kostka = new Kostka(); /* Należy zwrócić uwagę, że klasa abstrakcyjna nie dziedziczy żadnego interfejsu. (Implementacja interfejsów jest cechą klas takich jak 'Kula' czy 'Kostka' a nie klas abstrakcynych) * Mimo to klasa abstrakcyjna 'Bryla' implementuje metodę 'UstawPozycje(PozycjaNaOsi pozycja)' jako nornalną metode publiczną. (Metoda 'UstawPozycje' znajduje się w interfejsie 'IPozycja') * Przez co klasy pochodne klasy 'Bryla' nie muszą implementować własnej wersji tej metody, pomimo, że implementują interfejs 'IPozycja', gdyż została ona już odziedziczona. */ kula.UstawPozycje(new PozycjaNaOsi(1, 2, 4)); kostka.UstawPozycje(new PozycjaNaOsi(4, 1, 1)); }
static void Main(string[] args) { Console.WriteLine("Podaj promień kuli"); float a = float.Parse(Console.ReadLine()); if (a < 0) { Console.WriteLine("Podano ujemną wartość promienia. Wciśnij przycisk, aby zakończyć."); Console.ReadKey(); return; } Kula kula = new Kula(a); float pole = kula.ObliczPole(); float obj = kula.ObliczObjetosc(); Console.WriteLine("Pole: {0}, objętość: {1}", pole, obj); Console.ReadKey(); }
static void Obiekty_Przypisane_Do_Typu_Interfejs() { /* Można przypisać obiekt implementujący dany interfejs do typu danego interfejsu w taki sam sposób jak w rodziale 12 do typu wyżej w hierarchi dziedziczenia. * Tak samo możliwe jest utworzenie metody akceptującej parametry typu interfejs. np. */ Kula kula = new Kula(); IRuch ruchKuli = kula; RuchBryly(ruchKuli, new PozycjaNaOsi(1, 2, 2)); IRuch ruchKostki = new Kostka(1.1, 1.9, 2.9, new PozycjaNaOsi(1, 1, 2)); // 1 wymiary kostki, 2 pozycja na osi RuchBryly(ruchKostki, new PozycjaNaOsi(1, 2, 2)); void RuchBryly(IRuch bryla, PozycjaNaOsi nowaPozycja) { bryla.WykonajRuch(nowaPozycja); } }