using System; namespace cw11p2 { // definicja interfejsu // wszystkie metody z zalozenia sa publiczne interface Pismienny { string PodpiszSie(); } // Uczony implementuje interfejs Pismienny class Uczony : Pismienny { string mojeNazwisko; // konstruktor bezparametrowy public Uczony() { mojeNazwisko = "zapomnialem"; } // przeciazony konstruktor z parametrem public Uczony(string nazwisko) { mojeNazwisko = nazwisko; } // wlasciwosc (property) // jesli u jest klasy Uczony, to mozna wykonac // s = u.Nazwisko; // oraz // u.Nazwisko = "Jasio"; public string Nazwisko { get // co w przypadku pobierania wartosci { return mojeNazwisko; } set // co w przypadku ustalania wartosci { mojeNazwisko = value; // value to przypisywana wartosc System.Console.WriteLine("Uczony: ktos mi zmienil nazwisko!"); } } // troche sztuczna metoda, ale bedzie przykryta w klasie potomnej public virtual String JakSieNazywam() { return Nazwisko; } // implementacja metody z interfejsu Pismienny public string PodpiszSie() { return JakSieNazywam(); } } // kolejna implementacja interfejsu Pismienny class Analfabeta : Pismienny { // konstruktor domyslny bedzie wygenerowany // automatycznie // implementacja metody z Pismienny public string PodpiszSie() { // analfabeta nie umie pisac, wiec zglasza wyjatek (to umie) throw new Exception("Nie umiem pisac!"); } } // Matematyk to klasa potomna Uczonego // implementuje rowniez Pismienny class Matematyk : Uczony, Pismienny { // base() to wywolanie konstruktora klasy bazowej - Uczony public Matematyk(): base() { } // tu rowniez poslugujemy sie konstruktorem klasy bazowej public Matematyk(String nazwisko): base(nazwisko) { } // "przykrywamy" - override - metode wirtualna JakSieNazywam() // z Uczony public override string JakSieNazywam() { // base.JakSieNazywam() == Uczony.JakSieNazywam() return "2*PI*R " + base.JakSieNazywam(); } } class cw11p2 { // formalnie nie wiemy jakiej klasy obiekt bedzie przekazany static string Podpis(Object o) { // jesli jest "typu" Pismienny, to oddajemy jego // podpis, jesli nie - informacje ze nie umie // sie podpisac if (o is Pismienny) return (o as Pismienny).PodpiszSie(); else return "nie umie sie podpisac"; } static void Main(string[] args) { Uczony u1 = new Uczony(); Uczony u2 = new Uczony("Fizyk"); Matematyk m = new Matematyk("Matematyk"); Analfabeta a = new Analfabeta(); u1.Nazwisko = "Uczony 1"; // korzystamy z property Nazwisko Console.WriteLine("u1: {0}", Podpis(u1)); Console.WriteLine("u2: {0}", Podpis(u2)); Console.WriteLine("m: {0}", Podpis(m)); // uwaga, nadchodzi analfabeta // lapiemy wyjatki try { Console.WriteLine("a: {0}", Podpis(a)); } catch (Exception e) { Console.WriteLine("Analfabeta powiedzial: {0}", e.Message); } // Teraz 5 minut dla polimorfizmu Pismienny p1 = new Uczony("Polimorficzny uczony"); Pismienny p2 = new Matematyk("Polimorficzny matematyk"); Pismienny p3 = new Analfabeta(); // pismienny analfabeta - fiu fiu... Console.WriteLine("Teraz wersje ilustrujace polimorfizm:"); // mozemy korzystac z PodpiszSie, bo interfejs Pismienny // deklaruje ta metode Console.WriteLine("Uczony: {0}", p1.PodpiszSie()); Console.WriteLine("Matematyk: {0}", p2.PodpiszSie()); // UWAGA! Tutaj mamy nieprzechwycony wyjatek. // Ponizszy wiersz spowoduje otwarcie okna debugowania // programu w systemie Windows. Console.WriteLine("Analfabeta: {0}", p3.PodpiszSie()); // zadnych delete, mamy garbage collector } } }