Ta lekcja porusza temat klas abstrakcyjnych. Klasa abstrakcyjna to taka klasa która nie dostarcza nam dokładnych implementacji metod, oraz sam obiekt klasy również nie posiada dokładniej implementacji. Metoda abstrakcyjna bardzo jest zbliżona do działania metod wirtualnych, z tą różnicą, że w klasie wyprowadzonej z klasy abstrakcyjnej, metoda zadeklarowana jako abstract, musi zostać przykryta w klasie wyprowadzonej. Ok. Jak by to wyglądało w praktyce, spróbujmy zmodyfikować nasz poprzedni program dotyczący metod wirtualnych. Jak pamiętamy z poprzedniego programu, mieliśmy utworzoną klasę DwaD która to posiadała metodę wirtualną Pole(), założenie było takie, że tak najprościej liczy się pole. Dobrze ale teraz tak spójrzmy na tą naszą klasę trochę inaczej. W programowaniu C#.NET programiści nie tylko piszą pełno działające programy, wielkie uznanie zyskują programiści piszący własne klasy, które są bardzo wydajnie, oraz przyjazne dla użytkownika. Teraz jak popatrzmy na naszą klasę to tak na chłopski rozum, trochę czujemy się nieswojo skoro w klasie o nazwie DwaD (2D) umieszczamy klasę która to liczy pole, tłumacząc się tym, że jak by ktoś przypadkiem nie przykrył w klasie wyprowadzonej metody Pole() to klasa DwaD je policzy. No ale przypuśćmy, że z naszej klasy korzysta ktoś kto jest powiedzmy mało uważny i nie wie, że metoda Pole() jest wirtualna, wyprowadza on swoją klasę np. Trapez lub deltoid i teraz ma problem bo nie wie za bardzo gdzie błąd, ponieważ źle coś mu się pole liczy. Ale aby temu zapobiec naszą klasę DwaD zmienimy na abstrakcyjną oraz metodę Pole() również, będzie to oznaczało, że każda wyprowadzona klasa będzie musiała przykryć tą metodę, inaczej będzie zgłoszony błąd, zadeklarowanie klasy DwaD jako abstract daje nam jeszcze jeden atut, otóż nie będzie można tak naprawdę utworzyć obiektu DwaD, oczywiście możemy się posługiwać referencją do klasy bazowej, ale to jest co innego, utworzenie obiektu klasy DwaD tak naprawdę mija się z celem w naszym programie który operuje na figurach, czyli jak widzisz klasa abstract daje nam ogólny zarys jak mają wyglądać klasy wyprowadzone dodając metody abstrakcyjne mówimy klasie co ma dana metoda robić, ale nie mówimy jak. Teraz przejdziemy do przykładu który jest poniżej, zawarliśmy w nim to wszystko o czym pisaliśmy powyżej.
Początek kodu:
using System;
abstract class DwaD
{
public int x;
public int y;
public DwaD(int podaj_x, int podaj_y)
{
x = podaj_x;
y = podaj_y;
}
public abstract double Pole();
}
class Kwadrat : DwaD
{
public Kwadrat(int bok_a) : base(bok_a, bok_a)
{
}
public override double Pole()
{
return x * y;
}
}
class Trojkat : DwaD
{
public int c;
public double h;
public Trojkat(int bok_a, int bok_b, int bok_c, double wysokosc)
: base(bok_a, bok_b)
{
c = bok_c;
h = wysokosc;
}
public override double Pole()
{
return 0.5 * x * h;
}
}
class Okrag : DwaD
{
public int promien;
public Okrag(int r) : base(r, r)
{
promien = r;
}
public override double Pole()
{
return Math.PI * Math.Pow(promien, 2);
}
}
class Pokaz
{
public static void Main() {
DwaD figura = new Kwadrat(10);
string wybor = „” ;
Console.WriteLine(„Wybierz figurę:\n1 – Kwadrat\n2 – Trójkąt\n3 – Okrąg\n”);
Console.Write(„Twój wybór to: „);
wybor = Console.ReadLine();
switch(wybor){
case „1″ :
figura = new Kwadrat(143);
break ;
case „2″ :
figura = new Trojkat(10,6,7,Math.Sqrt(11));
break ;
case „3″:
figura = new Okrag(6);
break;
default :
Console.WriteLine(„Zły wybór”);
break ;
}
Console.WriteLine(„Pole figury: ” + figura.Pole());
}
}
Koniec kodu:
A więc do rzeczy, jak widzisz klasa DwaD posiada przed class słowo kluczowe abstract, oznacza to, że deklarujemy klasę jako abstrakcyjną, jednak nie oznacza to że musimy zawrzeć w klasie jakieś metody abstrakcyjne, klasa abstrakcyjna może istnieć bez nich, my jednak dodajemy metodę abstrakcyjną Pole(). Od razu co zapewne zwraca twoją uwagę jest to, że zaraz po () jest średnik (;) a nie ma bloku kodu z deklaracją metody. Jak pisaliśmy na początku, metoda abstrakcyjna musi zostać przykryta w klasach wyprowadzonych inaczej zostanie wywołany błąd, oraz nie możemy utworzyć obiektu klasy DwaD więc wywołanie metody Pole() z klasy DwaD jest nie możliwe. Więc nie ma jej deklaracji. Dodaliśmy jeszcze jedną klasę wyprowadzoną z klasy DwaD, klasę Okrąg która to liczy pole okręgu (Pole()). Na początku naszego pokazu działania tego kodu w klasie Pokaz piszemy DwaD figura = new Kwadrat(10);, dlaczego? Otóż jest to konieczne gdyż pod blokiem switch wywołujemy metodę Pole(), nie możemy utworzyć na początku obiektu DwaD, a zapisz DwaD figura ; jest błędny gdyż przy wywołaniu metody Pole pod switch jest błąd ponieważ nie ma referencji, dlatego na początku utworzyliśmy referencję do Kwadrat, było to w pewnym sensie konieczne, chyba że zrezygnujemy z możliwości wyboru figury i ze swich. Teraz rozumiesz jak to działa, klasę abstrakcyjną stosujemy wtedy gdy klasa nie jest wstanie dostarczyć wielo znacznej implementacji metody dla klas wyprowadzonych.