вторник, 17 апреля 2012 г.

Abstract class. What is it?

   Абстрактные классы. Что же это? И с чем это едят? Под сырным или укропным соусом? На эти и другие вопросы ответ будет дан ниже.
   Иногда возникает ситуация, когда мы имеем супер класс, большинство его методов используем в подклассах. Супер классы находясь в верхней части иерархии становятся настолько абстрактными, что их можно рассматривать как определенную базу для разработки других классов. В этом случае необходимо создавать абстрактные классы. 
abstract class   На рисунке слева изображена иерархическая цепочка классов, в которой определен абстрактный класс "Насекомое" и пара подклассов.
   Данный класс имеет два подкласса "Жук" и "Муха". Действительно "Жук" и "Муха" являются насекомыми, а обратное утверждение не может быть верным, ибо не каждое насекомое может быть мухой или же жуком.
   С абстрактными классами действительны следующие утверждения:
  • Нельзя использовать конструктор для абстрактного класса.
  • Если в подклассе не определить все методы абстрактного класса, то подкласс так же становится абстрактным.
  • Возможно создание массива абстрактных классов, где элементы массива инициализированы подклассами. При этом у элементов массива возможно вызывать методы только абстрактного класса.
   Обо всем этом далее более подробно.
   Для начала об определении абстрактного класса. Абстрактный класс обозначается в коде следующим образом
abstract class Insect {

}
   Абстрактный класс по определению должен содержать абстрактные методы, которые представляют собой прототипы методов, реализованных в подклассах.
   Для класса Insect определим метод getDesctiption(). C его помощью мы получим описание данного объекта.К примеру: Жук богомол любит траву, но и не против полакомиться своими соседями
public abstract class Insect {
 private String name;
 
 public Insect(String n){
  this.name = n;
 }
 
 public String getName(){
  return this.name;
 }
 
 abstract public String getDecription();
}
   Чтобы было возможно работать с этим методом, его необходимо определить в подклассе Fly
public class Fly extends Insect {
 public Fly(String n){
  super(n);
 }

 public String getName() {
  return super.getName();
 }

 /**
  * Переопределенный метод
  */
 @Override
 public String getDecription() {
  return  "Жук " + getName() + " любит питаться пальчиками людей";
 }
}
   Класс Fly уже нельзя назвать абстрактным, так как он определил все методы (точнее один единственный) своего супер класса Insect. Обычно переопределенные методы обозначаются с помощью конструкции @override. Она явно дает знать, что данный метод не собственный у класса, а метод переопределенный.
   Для класса Insect нельзя вызывать конструктор, т.к. это приведет к ошибке:
new Insect("полоскун");
Данный код приведет к ошибке. Но без проблем можно создать объект подкласса
Fly fly = new Fly("Навозная");
Несмотря на то, что у абстрактных классов нельзя вызывать конструктор, но переменные абстрактных классов все же можно использовать. Ниже показана эта возможность:
Insect[] insect = new Insect[2];
  insect[0] = new Fly("Цеце");
  insect[1] = new Bug("Усач");
  
  for(Insect i : insect){
   System.out.println(i.getDecription());
  }
Здесь мы создаем массив класса Insect, элементы которого инициализируем экземплярами подклассов Fly и Bug и далее вызываем метод getDecription(). Ниже весь код программы:
public class TestBug {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Fly fly = new Fly("Навозная");
  
  Insect[] insect = new Insect[2];
  insect[0] = new Fly("Цеце");
  insect[1] = new Bug("Усач");
  
  for(Insect i : insect){
   System.out.println(i.getDecription());
  }
 }

}

//Абстрактный класс
public abstract class Insect {
 private String name;
 
 public Insect(String n){
  this.name = n;
 }
 
 public String getName(){
  return this.name;
 }
 
 abstract public String getDecription();
}

public class Bug extends Insect {
 public Bug(String n){
  super(n);
 }
 public String getName(){
  return super.getName();
 }
 @Override
 public String getDecription() {
  return getName() + " спаситель черепах";
 }
}

public class Fly extends Insect {
 public Fly(String n){
  super(n);
 }

 public String getName() {
  return super.getName();
 }

 /**
  * Переопределенный метод
  */
 @Override
 public String getDecription() {
  return  "Жук " + getName() + " любит питаться пальчиками людей";
 }
}
На этом все! Спасибо:)

Комментариев нет:

Отправить комментарий

//ActionScript3 //C# //CSS //Java //JavaScript //Python //Sql //Xml