CentrumXP.pl » Witamy
CentrumXP.pl
 
Szukaj
Subskrypcja
Powiadomienie e-mailem o nowościach na CentrumXP.pl:
E-mail: Zapisz
Czy zamierzasz pobrać Internet Explorer 9?


CentrumXP.pl » Microsoft .NET » Kurs C#, cz. II » Dodaj do ulubionych Dodaj do ulubionych   Dodaj do ulubionych Wersja do wydruku

06. Dziedziczenie i polimorfizm

Autor: Paweł Kruczkowski    Opublikowano: 31 października 2006    Odsłon: 129517    »Skomentuj...
Strona:
Zobacz również:

01. Zmienne, stałe, wyrażenia i odstępy w C# 2.0

02. Usuwanie obiektów

03. Przekazywanie parametrów

04. Przeciążanie metod i konstruktorów

05. Hermetyzacja danych

07. Abstrakcja w C#

08. Porozmawiajmy o klasach

09. Struktury

10. Interfejsy, część 1

11. Interfejsy, część 2

12. Słowniki w C# 2.0

13. Łańcuchy w C# 2.0

14. Wyrażenia regularne

15. Wyjątki - część I

16. Wyjątki - część II

17. Delegaty i zdarzenia

18. Operacje wejścia - wyjścia cz.1

19. Operacje wejścia - wyjścia cz. 2

20. Atrybuty i mechanizm refleksji

»Uzyskaj pomoc na forum

Tematem niniejszego artykułu będzie dziedziczenie oraz polimorfizm. Oba te pojęcia są jednymi z najważniejszych z punktu widzenia programowania obiektowego. Bowiem prędzej czy później każdy z nas w swoich programach będzie musiał zdefiniować pewną ogólną klasę, która będzie definiować cechy wspólne dla zestawu pozostałych elementów. Co się za tym kryje? A no to, że klasę taką będzie mogła dziedziczyć inna klasa, która będzie bardziej specyficzna od tej odziedziczonej (ogólnej), i która z kolei będzie dodawać następne unikatowe cechy w swojej strukturze. Oczywiście tę nową klasę może dziedziczyć inna i proces dziedziczenia będzie się rozbudowywał tworząc prawidłową hierarchię w naszym kodzie. Z dziedziczeniem ściśle powiązany jest polimorfizm (poli oznacza wiele, zaś morf to forma), o którym dzisiaj będzie również kilka słów.

Po zdefiniowaniu powyższych nowych dla nas pojęć, postaramy się w oparciu o przykłady wprowadzić kolejne, takie jak metody: wirtualne i przysłaniające, czy słowo kluczowe: base, bez których to dziedziczenie oraz polimorfizm nie może żyć.

Zacznijmy więc od prawidłowego zdefiniowania dziedziczenia. Jak wiemy, programowanie obiektowe polega na rozbudowie istniejącego już kodu. Nie należy jednak nanosić poprawek do wcześniej zdefiniowanych klas (oczywiście, jeśli są dobrze zaprojektowane), tylko definiować kolejne klasy, które będą przejmować właściwości oraz cechy tych już istniejących. Takie postępowanie możliwe jest dzięki dziedziczeniu.

Załóżmy, że mamy klasę A, która dziedziczy po klasie B. W takiej sytuacji mówi się, że klasa B jest klasą bazową klasy A, natomiast klasa A jest klasą pochodną klasy B. W tym przypadku dziedziczenie polega na tym, że klasa A dziedziczy wszystkie cechy oraz zachowania klasy B, a także zawiera wyspecjalizowane składowe, dzięki którym można wykonać określone zadania.

W języku C# 2.0 klasę pochodną tworzy się w ten sposób, że po nazwie klasy pochodnej umieszczamy dwukropek, a po nim nazwę klasy bazowej. Na przykład:

public class PierwszaKlasa
{
     public int a;
     public int b;
 
     public void WyswietlAB()
     {
         System.Console.WriteLine("Wartości a i b wynoszą odpowiednio: {0} i {1}", a, b +".");
     }
}
 
public class DrugaKlasa : PierwszaKlasa
{
     public int c;
 
     public void WyswietlC()
     {
         System.Console.WriteLine("Wartość liczby c wynosi: {0}", c +".");
     }
 
     public void SumaLiczb()
     {
         int suma = a + b + c;
         System.Console.WriteLine("Suma liczb wynosi: {0}", suma +".");
     }
 }
 
 class Glowna
 {
     public static void Main(string[] args)
     {
         PierwszaKlasa pr = new PierwszaKlasa();
         DrugaKlasa dr = new DrugaKlasa();
        
//przypisanie wartosci zmiennym w obiekcie pr typu PierwszaKlasa i wywolanie        
metody pobierajacej te wartosci
         pr.a = 3;
         pr.b = 7;
           
         pr.WyswietlAB();
 
//klasa pochodna ma dostep do wszystkich skladowych publicznych pochodzacych z klasy, od ktorej je dziedziczy
         dr.a = 2;
         dr.b = 8;
         dr.c = 5;
 
         dr.WyswietlAB();
         dr.WyswietlC();
         dr.SumaLiczb();
     }
 }

W powyższym przykładzie zdefiniowaliśmy sobie dwie klasy: PierwszaKlasa, w której zadeklarowaliśmy sobie 2 zmienne składowe (a i b), których wartości będziemy wyświetlać za pomocą metody: WyswietlAB() oraz klasę DrugaKlasa, w której zdefiniowaliśmy zmienną składową c, której wartość będziemy pobierać za pomocą metody WyswietlC(). Klasa DrugaKlasa dziedziczy wszystkie cechy oraz właściwości od klasy PierwszaKlasa. W ten sposób w klasie: DrugaKlasa, będziemy mieli dostęp zarówno do zmiennych a i b pierwszej klasy jak i do metody WyswietlAB(), którą również zainicjalizowaliśmy w klasie: PierwszaKlasa.


1 2 3 4 5 6 7 Dalej» 

Aktualna ocena to: 4,21

Oceń artykuł...
Porażka Kiepski Taki Sobie Dobry Super!

Tagi:  

A teraz:    Dodaj do ulubionych Dodaj do ulubionych    Wydrukuj Wydrukuj    Wyślij link znajomemu Wyślij link znajomemu    Skomentuj Skomentuj

Komentarze do 06. Dziedziczenie i polimorfizm

Dodaj komentarz»

ramza 16 czerwca 2007, 1:21

Ogólnie fajnie...ale chyba wiem na jakiej ksiażce sie wzorujecie ;) strasznie podobne opisy i przykłady :)

Sfinks 11 lipca 2007, 13:23

co tak na wszystkich komentarzach tylko krytykujecie szanowni czytelnicy. Bardzo dobrze jest opisane, jak dla początkującego jest wystarczająco jasne i ciekawe. oczywiście jeżeli komuś się nie podoba może za jakiś 60 zeta kupić jakąś idiotyczną książkę Jessy Liberty(C# wprowadzanie, wydanie 2007), i wraz nic nie zrozumiejąc wracać tutaj i szukać o co tam w książce chodziło. ja jestem za autora. prawda niedoskonałości są , ale to tylko zauważy ktoś kto zna C++ lub java, ale nie są to błędy tylko za mało dopisane szczegóły.chyba nauka jest darmowa nie? wiec....

slavo 22 lipca 2007, 11:22

popieram, kupienie każdej książki >80PLN to 3/4 wiadomości które tutaj są, być może w bardziej zawiłych i abstrakcyjnych przykładach (zawsze zastanawiam się skąd autorzy biorą takie wydumane przykłady). Tu jest prosto i przejrzyście, gratuluję :)

Unbeliever 11 września 2007, 12:47

Bardzo fajny kurs! Drobne "wpadki" się zdarzają…ale z drugiej strony, gdzie ich nie ma! :) Zgrabnie skompensowana wiedza. Pozdrawiam!

Piotr 20 października 2007, 18:41

ok wszystko prosto ale ja tu czego nie rozumiem, bo autor przedstawil polimorfizm za pomoca przykladu z antena, a wogole potem nie powiedzial w ktorym miejscu on wysetpuje w porgramie i na czym polega tak naprawde w programie wiec w sumie nadal nie wiem co to jest ten polimorfizm w programie

piechu 22 października 2007, 14:57

wszystko fajnie ale zapomnieliscie podac istotnej cechy polimorfizmu, a dokladnie chodzi o operowanie na klasach pochodnych dysponujac referencja na klase bazowa np abstract class A{ abstract void rob(); } class B:A{} class C:A{} ... B bb=new B(); C cc= new C(); ArrayList lista=new ArrayList(); lista.add(bb); lista.add(cc); foreach(A temp in lista){ temp.rob(); }

Libre 26 grudnia 2007, 3:23

Kurs spoko, ale jezeli chodzi o ksiazki to sie nie zgadzam! Chyba nikt z was po porostu nie umie ksiazek wybierac:p.Specjalnie dla was proponuje zacząc od C# i .NET Stephen C. Perry :">

Piotr W-w 28 lutego 2008, 12:57

Super kurs. O to chodzi- najwazniejsze rzeczy- w sposob przystepny i zrozumialy

Kwaq 29 kwietnia 2008, 23:04

Moim zdaniem napisane w zrozumiały sposób. Bardzo ciekawy temat. Nauczyłem się czegoś nowego i to jest dla mnie najważniejsze :)

camillos 15 lipca 2008, 21:54

Wszystko fajnie tylko jak nic brakuje mi tu ćwiczeń, a temat jest dość obszerny więc było by co ćwiczyć.

Zet 1 lutego 2009, 13:34

Nie rozumiem tutaj jednej rzeczy: czym wobec tego różni się ukrycie danej metody od jej przesłonięcia?

nop 13 maja 2009, 11:28

świetny kurs
 

y 6 maja 2010, 10:24

dobry kurs, ale zauważyłem małe kłamstewko. Autor: "Ważną informacją jest fakt, że klasy nie dziedziczą konstruktorów". Serio? class A {   public A()   {   Console.WriteLine( "A" );   } } class B : A {   public B()   {   Console.WriteLine( "B" );   } } public static void Main()   {   B b = new B();   Console.ReadKey();   }

crv 27 lipca 2010, 13:49

Serio. Konstruktorów nie dziedziczymy. Oczywiście mamy możliwość dostępu do konstruktora klasy nadrzędnej i najczęściej używamy właśnie jego wywołania w konstruktorze klasy pochodnej.

konrad 7 lipca 2011, 1:41

A po co w przykładzie z PierwszaKlasa, DrugaKlasa, TrzeciaKlasa występuje polimorfizm, skoro jeśli usune słówko virtual i override to program dalej działa tak samo ?


Dodaj swój komentarz

»Zasady udzielania komentarzy

Autor:  
Komentarz:
Dodaj komentarz
© 2012 Onex Group
Onex Group O Onex Group  |  O CentrumXP.pl  |  Kontakt  |  Reklama
Nasze serwisy: CentrumXP.plXboxSpot.pl  |  Jama Mastaha