Programowanie w języku C#

Programowanie obiektowe

  • 2014-01-29 18:23
  • 0 komentarzy
  • 11702 odsłony
  • Oceń ten tekst jako pierwszy
Spis treści

          1 Podstawowe założenia
               1.1 Czym jest obiekt?
               1.2 Przykład klasy
               1.3 Funkcje składowe
          2 Mechanizmy programowania obiektowego
               2.1 Hermetyzacja
               2.2 Dziedziczenie
               2.3 Polimorfizm - metody wirtualne i abstrakcyjne
          3 Interfejsy



Podstawowe założenia


Programowanie obiektowe jest skupione wokół obiektów i ich relacji. Podstawową jednostką jest klasa.

Czym jest obiekt?


Obiekt jest to struktura danych łącząca dane wraz z zachowaniami. Jako zachowania często definiujemy funkcje składowe (często mówione jako metody) i podobne.

Przykład klasy


Stwórzmy klasę reprezentującą człowieka. Niech ta klasa zawiera podstawowe informacje oraz funkcję składową, która będzie drukować te dane.
class Czlowiek
{
   public string Imie { get; set; }
   public string Nazwisko { get; set; }
   public int Wiek { get; set; }
 
   public void PrzedstawSie()
   {
      Console.WriteLine(string.Format("{0} {1}, {2} lat", Imie, Nazwisko, Wiek));
   }
}


Funkcje składowe


Funkcja składowa odpowiada za operację na danych zawartych w klasie. Są odpowiednikiem zwykłych funkcji, lecz w tym przypadku dodatkowo mogą operować na wybranej instancji klasy (obiektu klasy).


Mechanizmy programowania obiektowego


Hermetyzacja


Hermetyzacja jest mechanizmem ukrywania niepotrzebnych danych przed różnymi kręgami dostępu. Takie działanie pozwala na ograniczenie błędów w oprogramowaniu. Wyróżniamy kilka poziomów dostępów, które zapisujemy obok składnika klasy (pola klasy/zmiennej klasy, funkcji składowej, właściwości, zdarzenia, delegatu, klasy...)

  1. public - sprawia, że element jest widoczny publicznie (wszędzie)
  2. protected - sprawia, że element klasy będzie widoczny, ale dla klas, które będą ją dziedziczyć (zob. dziedziczenie)
  3. private - sprawia, że element klasy będzie widoczny tylko i wyłącznie dla tej klasy.
  4. internal - sprawia, że element klasy będzie widoczny jak zakres publiczny z taką różnicą, że tylko w podzespole (programie, pisanej bibliotece itp.), w którym się znajduje
  5. protected internal - sprawia, że element klasy będzie widoczny tylko dla klas dziedziczących nią, które znajdują się w podzespole, gdzie klasa została zdefiniowana

Przykład użycia:
class Czlowiek
{
   public string Imie { get; set; }
   public string Nazwisko { get; set; }
   public int Wiek { get; set; }
 
   public void PrzedstawSie()
   {
      Console.WriteLine(string.Format("{0} {1}, {2} lat", Imie, Nazwisko, Wiek));
   }
 
   private void ZamienImieZNazwiskiem()
   {
      string tmp;
      tmp = Imie;
      Imie = Nazwisko;
      Nazwisko = tmp;
   }
}
 
Czlowiek czlowiek = new Czlowiek { Imie = "Konrad", Nazwisko = "Wallenrod", Wiek = 44 };
czlowiek.PrzedstawSie();
czlowiek.ZamienImieZNazwiskiem(); // błąd kompilatora


Dziedziczenie


Dziedziczenie jest mechanizmem, który sprawia, że klasa może posiąść cechy innej klasy. Przez cechy rozumiemy elementy publiczne, chronione, wewnętrzne oraz chronione wewnętrzne. Podczas dziedziczenia elementy prywatne nie są dziedziczone. Klasy, które są dziedziczone, nazywamy bazowymi a te, które dziedziczą, pochodnymi. Przykład dziedziczenia:
class Bazowa
{
   public int Dane { get; set; }
   public void Metoda1() { }
}
 
class Pochodna : Bazowa
{
   public int Metoda2() { return Dane * 2; }
}
 
Bazowa bazowa = new Bazowa { Dane = 12 };
bazowa.Metoda1();
 
Pochodna pochodna = new Pochodna { Dane = 66 };
pochodna.Metoda1();
pochodna.Metoda2();


Nie można dziedziczyć, gdy klasa, która jest dziedziczona, jest zaplombowana (opatrzona słowem kluczowym sealed). Nie można dziedziczyć również dwóch klas jednocześnie. Należy pamiętać, że referencja do typu pochodnego jest poddawana konwersji niejawnej do referencji do typu podstawowego (intuicyjnie: samochód jest szczególnym przypadkiem pojazdu, więc jest pojazdem; podobnie jest z klasami).

Polimorfizm - metody wirtualne i abstrakcyjne


Polimorfizm jest mechanizmem, który uruchamia metody, indeksery i właściwości w czasie wykonywania. Widać to dobrze w tym przykładzie:
class Instrument
{
   public virtual void Graj() { Console.WriteLine("Nieokreślony dźwięk"); }
}
 
class Gitara : Instrument
{
   public override void Graj() { Console.WriteLine("Brzdęk!"); }
}
 
Instrument instrument;
instrument = new Instrument();
instrument.Graj();
instrument = new Gitara();
instrument.Graj();


Metoda, która tak się zachowuje, jest metodą wirtualną. Natomiast metodą wirtualną bez swojego ciała nazywamy metodą abstrakcyjną. Składnia wygląda tak:
public abstract void Coś();

Metoda wirtualna oraz abstrakcyjna nie może być jako metoda prywatna i/lub statyczna.


Interfejsy


Interfejs jest odpowiednikiem klasy abstrakcyjnej ze wszystkimi metodami, indekserami, właściwościami i zdarzeniami jako elementy abstrakcyjne z taką różnicą, że klasa może dziedziczyć wiele interfejsów.
Interfejs tworzymy następująco:
interface IInterfejs
{
   void Metoda();
   int this[string str] { get; set; } // indekser
   event JakisDelegat Zdarzenie;
}