C, PHP, VB, .NET

Дневникът на Филип Петров


* Наследяване в Java

Публикувано на 08 октомври 2009 в раздел ПИК3 Java.

Както всеки обектно-ориентиран език за програмиране, така и Java позволява наследяване. Това е възможността един клас да наследи цялата функционалност на друг клас и да я разшири. Класът, който е наследяван се нарича "родителски клас", а класа който наследява се нарича "наследник". Освен да добавят нова функционалност, наследниците също могат да изменят съществуваща.

Нека вземем един примерен клас за деца с метод, в който децата играят играта "камък - ножица - хартия". В главната програма ще пуснем децата да изиграят 10 поредни игри:

Файл kid.java:

package kids;
import java.util.Scanner;
class Kid{
  public String name;
  public Kid(){
    Scanner s = new Scanner(System.in);
    System.out.print("Enter the kid name: ");
    this.name = s.next();
  }
  public Kid(String name){
    this.name = name;
  }
  public static void introduce(){
    System.out.println("Hello, nice to meet you!");
  }
  public int getRand(){
    int r = (int)Math.floor(Math.random()*3);
    return r;
  }
  public void playRPS(Kid oponent){
    int i = this.getRand();
    int j = oponent.getRand();
    String[] rps = {"leafs", "scissors", "rocks"};
    if (i == j){
      System.out.println(this.name+" and "+oponent.name+
                         " both played "+rps[i]);
      System.out.println("The game is tie");
    }
    else{
      System.out.println(this.name+" played "+rps[i]+
                         " and "+oponent.name+" played "+rps[j]);
      switch(i){
        case 0:
          if (j == 1) System.out.println(oponent.name+" wins!");
          else System.out.println(this.name+" wins!");
          break;
        case 1:
          if (j == 2) System.out.println(oponent.name+" wins!");
          else System.out.println(this.name+" wins!");
          break;
        case 2:
          if (j == 0) System.out.println(oponent.name+" wins!");
          else System.out.println(this.name+" wins!");
          break;
      }
    }
  }
}

Файл kidsplay.java:

package kids;

public class kidsplay{
  public static void main(String[] args){
    Kid ivancho = new Kid("Ivancho");
    Kid pencho = new Kid("Pencho");
    for (int i=0; i<10; i++){
      ivancho.playRPS(pencho);
      System.out.println();
    }
  }
}

Нека сега създадем клас "момче", което има същите свойства, каквито и клас "дете", но добавя и нова функция:

Файл Boy.java:

package kids;
class Boy extends Kid{
  public String sex = "male";
  public Boy(){
    // извикване на конструктора на базовия клас
    super();
  }
  public Boy(String name){
    // извикване на конструктора на базовия клас
    super(name);
  }
  public void proposeGame(){
    System.out.println(this.name+" said: Let's go play football!");
  }
}

Виждате, че можем да извикаме конструктора на базовият клас (също познат специално в Java и като "сурер клас") чрез извикване на метод "super()". Това все пак е нужно, защото всеки клас трябва да има конструктор (в случая конструктора на Boy изниква конструктора на Kid).

Можем да наследим класа и втори път:
Файл Girl.java:

package kids;
class Girl extends Kid{
  public String sex = "female";
  public Girl(){
    super();
  }
  public Girl(String name){
    super(name);
  }
  public void proposeGame(){
    System.out.println(this.name+" said: Let's play fast and loose!");
  }
}

Нека сега променим главната програма така, че да работи вече с класове Boy и Girl:

Файл kidsplay.java:

package kids;

public class kidsplay{
  public static void main(String[] args){
    Boy ivancho = new Boy("Ivancho");
    Girl mariika = new Girl("Maria");
    for (int i=0; i<10; i++){
      ivancho.playRPS(mariika);
      System.out.println();
    }
    ivancho.proposeGame();
    mariika.proposeGame();
  }
}

Виждате, че всички функции от базовия клас бяха наследени от наследника му. Освен това трябва да обърнете внимание на метод playRPS(). Той очакваше като входен параметър обект от тип Kid, а ние му "изпращаме" обект от тип Girl. Въпреки това програмата ще работи. Това е и първият "зачатък" на полиморфизъм. По-подробно ще го разгледаме в следваща статия.

 



Добави коментар

Адресът на електронната поща няма да се публикува


*