W
dzisiejszym artykule będziemy kontynuować temat klas w języku C# 2.0. Na łamach
portalu CentrumXP zostało już o nich bardzo wiele napisane i każdy z nas
potrafi prawidłowo zdefiniować pojęcie klasy jak i bez żadnego problemu ją
zaimplementować w swoim programie.
Dzisiaj
powiemy sobie jeszcze o klasach zamkniętych, klasie Object oraz samym
mechanizmie zagnieżdżania klas.
Tydzień
temu poznaliśmy sposób definiowania oraz stosowania klas abstrakcyjnych. Jak
pamiętamy, są to klasy, które stanowią w pewnym sensie kontrakt dla klas
pochodnych, które dziedziczą właśnie klasę abstrakcyjną. Innymi
słowy, klasa abstrakcyjna opisuje publiczne metody klas pochodnych. Nie jest
przypadkiem, że o tych klasach w tym miejscu wspominamy, ponieważ ich
przeciwieństwem są tzw. klasy zamknięte. Klasy te charakteryzują się tym, że od
nich nie można w ogóle tworzyć klas pochodnych (w przeciwieństwie do klas
abstrakcyjnych). Napiszmy na początek prosty programik, w którym użyjemy klasy
abstrakcyjnej:
abstract public class Figura
{
protected double e,
f;
public Figura(double
e, double f)
{
this.e = e;
this.f = f;
}
abstract public void Komunikat();
}
class Romb : Figura
{
public Romb(double e,
double f) : base(e,
f)
{ }
public override void Komunikat()
{
System.Console.WriteLine("Program
obliczający pole rombu.");
}
public double
ObliczPole()
{
return (e * f) / 2;
}
}
class Glowna
{
static void Main(string[] args)
{
Romb r = new Romb(6, 8);
double wynik = r.ObliczPole();
r.Komunikat();
System.Console.WriteLine("Pole naszego rombu wynosi: {0}", wynik +".");
}
}
W powyższym przykładzie abstrakcyjna klasa Figura definiuje publiczną metodę Komunikat(), która z kolei jest
przesłonięta w klasie Romb wg
poznanych już przez nas zasad. A więc mechanizm dziedziczenia i polimorfizmu
jest w jak najlepszym stopniu prawidłowo zastosowany, dlatego też po
skompilowaniu i uruchomieniu powyższego kodu otrzymamy następujące wyniki: