OOP in Java - Inheritance and Polymorphism

Tutaq ki, Student ve Teacher class-larimiz var ve bu class-lar name , surname,  age adli eyni deyishenlere sahibdir. Umumi baxsaq, name surname age her bir kesde olur. Buna gore bir Person class i duzeldirik ve ichine name surname age deyishenlerini atiriq. Student ve Teacher de olan eyni adli deyishenleri silirik. Lakin, hele de proqramda Student ve Teacher hele de Person sayilmir. Bunun uchun uygun class-lari Person classindan extend etmek lazimdir. Bu zaman, uygun class-lar Person classinin xususiyyetlerine ( yeni, deyishen ve ya metodlarina sahib olacaq ).

Duzgun halda qeyd etmek olar ki, Student ve Teacher classi daxilinde xususi olaraq qeyd olunur ki, Person classinin deyishen ve metodlari bu uygun classa aiddir. Lakin, birbasha aid deyil.

Tutaq ki, Teacher classina xas olan salary deyisheni movcuddur. Bu zaman, hemin deyisheni Teacher classinda yaratmaliyiq. Bu deyishene ne Student classi ne de Person classi sahib olacaq.
Burdan bele netice alinir ki, extend olunan class (numunemizde Teacher ve ya Student) oz xususiyyetleri ile yanashi, hem de extend olundugu classin xususiyyetlerine malik olacaqdir. Lakin, bunun eksi hali mumkun deyil, yeni Person class i Teacher classnin hech bir xususiyyetine sahib deyil.

Consturctorlarin ishleme prinsipi


public class Person {

    private String name;
    private String surname;
    private Integer age;
    
    public Person() {}

    public Person(String name, String surname, Integer age) {
        this.name = name;
        this.surname = surname;
        this.age = age;
    }

    /* getters and setters */
}



public class Teacher extends Person {

    private Double salary;

    public Teacher(String name, String surname, 
                   Integer age, Double salary) {
        super(name, surname, age);
        this.salary = salary;
    }

    /* getters and setters */
}

public class Student extends Person {

    public Student(String name, String surname, Integer age) {
        super(name, surname, age);
    }
}

Tutaq ki, Teacher obyektini yaratmaq isteyirik.

Teacher t = new Teacher("Hamid","Sultanzadeh",32,2300.0);

Teacher 4 parametrli consturctoruna muracietden sonra, super() metodu vasitesi ile ozunden bir yuxari obyekti, yeni extend olundugu classin construcotrunu cagiririq. Dolayi yolla sahib oldugu deyishenlere deyerleri set eledikden sonra, oz consturctoru ishini davam ederek ozunun sahib oldugu deyishenlere deyerleri set edir.

Polymorphism

"is - a" elaqesi
Yuxardaki numuneye uygun olaraq, tutaq ki, checkIt() adinda Person tipinde deyishen qebul eden bir funksiyamiz var.
Yaratdigimiz  Student ve Teacher obyektlerini sira ile funksiyamiza gondermeyimize baxmayaraq, hech bir xeta almiriq. Obyektler Persondan extend olduguna gore,  hech bir xeta olmur, amma funksiya parametrindeki p deyisheni, yalniz Person obyektinin sahib olacagi xususiyyetlere sahibdir. Baxmayaraq ki, Teacher obyektinde elave olaraq salary deyisheni var. Funksiyadaki p deyisheni ise, Teacher obyekti almagina baxmayaraq hemin salary deyishenini gormur.
Bu veziyyetin aradan qaxlmasi uchun, evvelce gelen obyektin, yeni p-nin hansi class oldugunu teyin etmeliyik. Bunun uchun instance of keyword istifade olunur.
Obyekti teyin etdikden sonra rahatliqla, hemin obyekte xas olan istenilen deyishen ve metodlari gore bilerik.
Buradan bele netice chixirki, numunuye uygun olaraq, Teacher ve Student eslinde Persondur.  (Teacher is a Person, Student is a Person)


Person p1 = new Student("hamid","hamid",213);
Person p2 = new Teacher("hh","hh",12,23.0);

System.out.println(p1);
System.out.println(p2);
Polymorphism, bir obyektin ozunu bashqa bir obeykt kimi aparmasina deyilir.
Yuxardaki kod numunesine baxsaq, Person tipinde olan bir deyishene, Student ve Teachehr obyekti menimsedilib. Uygun obyektlerin menimsedilmesine baxmayaraq, p1 ve p2 deyisheni ozunu Person obyekti kimi aparir. Chunki tipi Persondur. Hetta p2 deyisheni, Teacher e xas olan salary deyishenini gore bilmir.

"has - a" elaqesi
Meselen Teacher obyekti Person dan extend etmeyib, amma Teacher daxilinde Person obyekti yaradilib.


public class Teacher {
 
    Person p = new Person();
    private Double salary;

    /* some code */
    /* getters and setters */
}

Bu zaman, Teacher artiq Person obyektine sahibdir. Bu prinsip "has - a " adlanir.
(Teacher has a Person)

Comments

Popular posts from this blog

Validation for AZ phone numbers with RegEx in Java

Java necə işləyir, kod nədir ?

@Transactional annotation haqqinda. Cascade istifade olunmasi