- Törəmə sinif yaratmaq və
virtual,override,baseaçar sözlərindən istifadə etmək - Abstrakt sinif və abstrakt metodun nə üçün lazım olduğunu izah etmək
- İnterfeys təyin etmək və onu bir neçə sinifdə reallaşdırmaq
- Polimorfizmi nümunələrlə izah etmək
Oyunda it, pişik və tutuquşu var. Hamısının adı var, hamısı özünü təqdim edə bilir, amma hər biri fərqli səs çıxarır. Eyni kodu üç dəfə köçürmək əvəzinə ümumi hissəni bir valideyn sinfə yığırıq, fərqləri isə törəmə siniflərdə yazırıq. Sonra isə bütün heyvanlarla eyni dövrdə, eyni kodla işləyirik — bu, obyektyönlü proqramlaşdırmanın ən güclü ideyalarından biridir.
Varislik: virtual və override
class Dog : Animal yazılışı Dog sinfinin Animal-dan törədiyini bildirir: o, valideynin bütün public üzvlərini alır. Valideyn sinifdə virtual kimi işarələnmiş metodu törəmə sinif override ilə yenidən təyin edə bilər. base açar sözü valideynin versiyasını çağırmağa imkan verir. Əsas konstruktorlarda valideynin konstruktoruna arqument birbaşa ötürülür: : Animal(name).
List<Animal> pets = [new Dog("Rex"), new Cat("Mestan"), new Animal("Nemo")];
foreach (Animal pet in pets)
Console.WriteLine(pet.Introduce());
class Animal(string name)
{
public string Name => name;
public virtual string Speak() => "...";
public virtual string Introduce() => $"I am {Name} and I say {Speak()}";
}
class Dog(string name) : Animal(name)
{
public override string Speak() => "Woof!";
}
class Cat(string name) : Animal(name)
{
public override string Speak() => "Meow!";
public override string Introduce() => base.Introduce() + " (and ignores you)";
}I am Rex and I say Woof! I am Mestan and I say Meow! (and ignores you) I am Nemo and I say ...
Diqqət et: pets siyahısının tipi List<Animal>-dır, amma pet.Introduce() çağırılanda hər obyekt öz Speak metodunu işlədir. Eyni çağırışın obyektin həqiqi tipinə görə fərqli nəticə verməsinə polimorfizm (çoxformalılıq) deyilir. Dövr it, pişik və ya gələcəkdə əlavə ediləcək tutuquşu haqqında heç nə bilmir — və bilməli də deyil.
Abstrakt siniflər
Bəzən valideyn sinif özü tam deyil: «fiqur»un sahəsini hesablamaq olmur, sahəni yalnız konkret düzbucaqlı və ya dairə üçün tapmaq olar. Belə sinif abstract elan olunur. Ondan obyekt yaratmaq mümkün deyil (new Shape() CS0144 xətası verir), onun gövdəsiz abstract metodlarını isə hər törəmə sinif mütləq reallaşdırmalıdır — əks halda CS0534 xətası yaranır.
using System.Globalization;
CultureInfo.CurrentCulture = CultureInfo.InvariantCulture;
Shape[] shapes = [new Rectangle(4, 3), new Square(5), new Circle(1)];
foreach (Shape s in shapes)
Console.WriteLine($"{s.GetType().Name}: area {s.Area():F2}");
abstract class Shape
{
public abstract double Area();
}
class Rectangle(double width, double height) : Shape
{
public override double Area() => width * height;
}
class Square(double side) : Rectangle(side, side);
class Circle(double radius) : Shape
{
public override double Area() => Math.PI * radius * radius;
}Rectangle: area 12.00 Square: area 25.00 Circle: area 3.14
Square Rectangle-dən törəyir və onun Area metodunu hazır götürür — ona gövdə belə lazım olmadı.İnterfeyslər
İnterfeys müqavilədir: sinfin hansı metod və xassələrə malik olmalı olduğunu deyir, amma onların necə işlədiyini demir. İnterfeys adları ənənəvi olaraq I hərfi ilə başlayır: INotifier, IComparable. Sinif : INotifier yazaraq müqaviləni qəbul edir və onun bütün üzvlərini reallaşdırmalıdır. Bir-biri ilə qohum olmayan siniflər də eyni interfeysi reallaşdıra bilər.
List<INotifier> notifiers =
[
new EmailNotifier("aysel@example.com"),
new SmsNotifier("+994 50 000 00 00")
];
foreach (INotifier n in notifiers)
n.Send("Your order has shipped!");
interface INotifier
{
void Send(string message);
}
class EmailNotifier(string address) : INotifier
{
public void Send(string message) => Console.WriteLine($"Email to {address}: {message}");
}
class SmsNotifier(string phone) : INotifier
{
public void Send(string message) => Console.WriteLine($"SMS to {phone}: {message}");
}Email to aysel@example.com: Your order has shipped! SMS to +994 50 000 00 00: Your order has shipped!
Sabah Telegram bildirişi lazım olsa, yalnız INotifier-i reallaşdıran yeni TelegramNotifier sinfi yazılır — dövrə toxunmağa ehtiyac qalmır. .NET-in özü də interfeyslərlə doludur: IComparable<T> obyektlərin sıralanmasını, IEnumerable<T> isə foreach ilə gəzilməsini mümkün edir.
| Meyar | Abstrakt sinif | İnterfeys |
|---|---|---|
| Neçəsindən törəmək olar | yalnız bir | istənilən qədər |
| Sahələr və vəziyyət | ola bilər | olmur |
| Nə vaxt seçməli | yaxın qohum siniflərin ümumi kodu var | fərqli siniflər eyni bacarığı bölüşür |
Əsas fikirlər
class Dog : Animal—DogAnimal-dan törəyir və onun üzvlərini alır; sinfin yalnız bir valideyni ola bilər.virtualmetodu törəmə sinifoverrideilə yenidən təyin edir;basevalideynin versiyasını çağırır.abstractsinifdən obyekt yaratmaq olmaz; onun abstrakt metodlarını törəmə siniflər reallaşdırır.- İnterfeys müqavilədir; sinif bir neçə interfeysi reallaşdıra bilər.
- Polimorfizm: eyni çağırış obyektin həqiqi tipinə görə fərqli işləyir.
Özünü yoxla
10 sual. Hər düzgün cavab XP qazandırır.