İrsləmə

Java SELF AZ
Səviyyə , Dərs
Mövcuddur

1. Pegas

Gəlin OOP-in üçüncü prinsipini – OOP, yəni irsiqlik prinsipini daha dərindən öyrənək. Bu, çox maraqlı mövzudur və çox istifadə edəcəyiniz bir şeydir. Proqramlaşdırma, anlamayanlar üçün, sehirdən fərqlənmir. Ona görə də belə maraqlı bir bənzətmə ilə başlayaq...;

Təsəvvür edin ki, siz bir sehirbazsınız və uçan bir at yaratmaq istəyirsiniz. Bir tərəfdən, bir pegas yaratmağa çalışa bilərsiniz. Amma təbii ki, təbiətdə pegaslar yoxdur, ona görə bu çox çətin olacaq. Çox şeyi özünüz etməli olacaqsınız. Daha asan yol - hazır bir at götürüb ona qanad əlavə etməkdir.

İrsiqlik. OOP

Proqramlaşdırmada belə prosesə "irsiqlik" deyilir. Təsəvvür edin ki, çox mürəkkəb bir class yazmalı olmusunuz. Sıfırdan yazmaq uzun vaxt alacaq, sonra uzun müddət yoxlamaq və səhvləri tapmaq lazım olacaq. Niyə ən çətin yolu seçəsiniz? Ən yaxşısı hazır bir class axtarmaqdır. Bəlkə artıq lazım olan class var?

Təsəvvür edək ki, siz 80% funksionalı yerinə yetirən bir class tapdınız. İndi bu class ilə nə edə bilərsiniz? Sadəcə olaraq onun kodunu öz class-ınıza kopyalaya bilərsiniz. Amma bu həll yolunun bir neçə mənfi tərəfi var:

  1. Tapılan class artıq byte-code şəklində kompilyasiya edilmiş ola bilər və onun mənbə koduna girişi yoxdur.
  2. Mənbə kodu var, amma siz elə bir şirkətdə işləyirsiniz ki, 6 sətir belə başqa kod istifadə etdiyiniz üçün milyardlarla dollar dəyərində məhkəməlik ola bilərsiz. Sonra sizi məhkəməyə verər.
  3. Lazımsız böyük kod təkrarlanması. Üstəlik, əgər başqa class-ın müəllifi səhv tapıb onu düzəldərsə, sizin kodunuzda bu səhv qalır.

Bunun daha incə bir yolu var və orijinal class-ın koduna qanuni giriş tələb olunmur. Java-da sadəcə həmin class-ı öz class-ınızın parent-i elan edə bilərsiniz. Bu, sanki həmin class-ın kodunu öz kodunuza əlavə etdiyiniz kimi olacaq. Sizin class-ınızda parent class-ın bütün məlumatları və metodları olacaq. Məsələn, belə edə bilərsiniz: "at" class-ından irsilik alırıq, "qanad" əlavə edirik - "pegas" yaradırıq

İrsiqlik. OOP


2. Ümumi əsas sinif

İrsiyyət digər məqsədlər üçün də istifadə edilə bilər. Tutaq ki, on çox oxşar, uyğun gələn məlumatlar və metodlara malik sinifləriniz var. Siz xüsusi əsas sinif yarada, bu məlumatları (və onlarla işləyən metodları) həmin əsas sinfə çıxara və həmin on sinfi onun varisi elan edə bilərsiniz. Yəni hər sinifdə onun bir parent sinfi olduğunu göstərmək olar - həmin əsas sinif.

Eyni zamanda abstraksiya üstünlükləri yalnız kapsulyasiya ilə birlikdə tam aşkara çıxdığı kimi, irsiyyətin üstünlükləri də polimorfizmdən istifadə zamanı daha güclüdür. Amma bunu bir az sonra anlayacaqsınız. Bu gün isə irsiyyətin istifadəsinə dair bir neçə nümunəyə baxacağıq.

Şahmat fiqurları

Tutaq ki, istifadəçi ilə şahmat oynayan bir proqram yazırıq, deməli, bizə fiqurlar üçün siniflər lazım olacaq. Bu siniflər hansı olacaq?

Əgər siz heç vaxt şahmat oynamısınızsa, bu asandır — Şah, Vezir, Fil, At, Qala və Piyada.

Amma sinifin özündə bütün fiqurlar üzrə məlumat saxlamaq lazım olardı. Məsələn, x və y koordinatları, həm də fiqurun dəyəri. Çünki bəzi fiqurlar digərlərindən daha qiymətlidir.

Bundan əlavə, fiqurlar fərqli şəkildə hərəkət edirlər, yəni siniflərin davranışı da fərqlənir. Bunu siniflər şəklində belə təsvir etmək olar:

class King
{
   int x;
 int y;
   int worth;

   void kingMove()
   {
     // şahın
     // necə hərəkət
     // edəcəyini
     // həll edən kod
   }
}
class Queen
{
   int x;
   int y;
   int worth;

   void queenMove()
   {
     // vezirin necə
     // hərəkət edəcəyini
     // həll edən kod
   }
}
class Rook
{
   int x;
   int y;
   int worth;

   void rookMove()
   {
     // qalanın necə
     // hərəkət edəcəyini
     // həll edən kod
   }
}
class Knight
{
   int x;
   int y;
   int worth;

   void knightMove()
   {
     // atın necə
     // hərəkət edəcəyini
     // həll edən kod
   }
}
class Bishop
{
   int x;
 int y;    int worth;

   void bishopMove()
   {
     // filin necə
     // hərəkət edəcəyini
     // həll edən kod
   }
}
class Pawn
{
   int x;
   int y;
   int worth;

   void pawnMove()
   {
     // piyada necə
     // hərəkət edəcəyini
     // həll edən kod
   }
}

Bu, şahmat fiqurlarının çox primitiv təsviridir.

Ümumi əsas sinif

İrsiyyət vasitəsilə kodu necə azalda biləcəyimizə baxaq. Eyni metodları və məlumatları ümumi sinifə çıxara bilərik. Onu ChessItem adlandıraq. ChessItem sinfinin obyektlərini yaratmağın heç bir mənası yoxdur, çünki ona uyğun şahmat fiquru yoxdur, amma ondan çox fayda olardı:

class King extends ChessItem
{
   void kingMove()
   {
     // şahın necə
     // hərəkət edəcəyini
     // həll edən kod
   }
}
class Queen extends ChessItem
{
   void queenMove()
   {
     // vezirin necə
     // hərəkət edəcəyini
     // həll edən kod
   }
}
class Rook extends ChessItem
{
   void rookMove()
   {
     // qalanın necə
     // hərəkət edəcəyini
     // həll edən kod
   }
}
class ChessItem
{
   int x;
   int y;
   int worth;
}
class Knight extends ChessItem
{
   void knightMove()
   {
     // atın necə
     // hərəkət edəcəyini
     // həll edən kod
   }
}
class Bishop extends ChessItem
{
   void bishopMove()
   {
     // filin necə
     // hərəkət edəcəyini
     // həll edən kod
   }
}
class Pawn extends ChessItem
{
   void pawnMove()
   {
     // piyada necə
     // hərəkət edəcəyini
     // həll edən kod
   }
}

Bu, oxşar obyektlərin kodunu sadələşdirmək üçün əla üsuldur. Xüsusilə layihədə minlərlə müxtəlif obyekt və yüzlərlə sinif olduqda çox üstünlüyümüz olur. Bu zaman düzgün seçilmiş parent (əsas) siniflər təkcə məntiqi xeyli sadələşdirməyə deyil, həm də kodu onlarla dəfə azaltmağa kömək edə bilər.


3. Klassın İrsiliyi — extends

Bəs bir klası irs almaq üçün nə etmək lazımdır? Bir klası digərindən irs almaq üçün bizim klassımızı elan etdikdən sonra extends açar sözünü və parent klassının adını yazmağımız lazımdır. Bu təxminən belə görünür:

class Sonra extends Parent

Məhz bu konstruktsiyanı Sonra klassını elan edərkən yazmalısınız. Bu arada, yalnız bir klassdan irs almaq mümkündür.

Klassın irsiliyi – extends

Şəkildə biz “inqi”dən “donuzu”, “donuz”dan “toyuğu”, “toyuq”dan isə “yumurtanı” irs alırıq. Yalnız bir valideyn! Belə irsilik həmişə məntiqi deyil. Amma yalnız donuz varsa, proqramçı çox vaxt donuzdan “inq” düzəltmək istəyindən imtina edə bilmir.

Java-da çoxsaylı irsilik yoxdur: bir klası iki klassdan irs almaq mümkün deyil. Hər klassın yalnız bir parent klası ola bilər. Əgər parent klass göstərilməzsə, Object klassı parent hesab olunur.

Bununla belə, Java-da interfeyslərin çoxsaylı irsiliyi mövcuddur. Bu, problemin kəskinliyini bir qədər azaldır. İnterfeyslər haqqında bir az sonra danışacağıq, ancaq hələlik gəlin irsiliyi araşdırmağa davam edək.

P.S.

Baxın, sizə bir neçə hekayə var, necə çox vaxt milçəyi donuza çevirmək lazım gəlir. Və bunun üçün nə olur:


Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION