Məzmuna keç
Educora
Orta20 dəq7 / 16

Varislik, interfeyslər və polimorfizm

Mövcud siniflərdən yeni siniflər törət, metodları `virtual` və `override` ilə yenidən təyin et, abstrakt siniflər və interfeyslərlə eyni kodun müxtəlif obyektlərlə işləməsinə nail ol.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • Törəmə sinif yaratmaq və virtual, override, base aç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).

C#
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)";
}
Gözlənilən nəticə
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.

C#
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;
}
Gözlənilən nəticə
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.

C#
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}");
}
Gözlənilən nəticə
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.

MeyarAbstrakt sinifİnterfeys
Neçəsindən törəmək olaryalnız biristənilən qədər
Sahələr və vəziyyətola bilərolmur
Nə vaxt seçməliyaxın qohum siniflərin ümumi kodu varfərqli siniflər eyni bacarığı bölüşür

Əsas fikirlər

  • class Dog : Animal — Dog Animal-dan törəyir və onun üzvlərini alır; sinfin yalnız bir valideyni ola bilər.
  • virtual metodu törəmə sinif override ilə yenidən təyin edir; base valideynin versiyasını çağırır.
  • abstract sinifdə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.

1 / 10
Törəmə sinifdə valideynin metodunu yenidən təyin etmək üçün hansı açar söz işlədilir?