Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Документ Microsoft Word.docx
Скачиваний:
7
Добавлен:
15.05.2015
Размер:
201.46 Кб
Скачать

Наследование.

Наследование — это процесс, посредством которого один объект может приобретать свойства другого. Точнее, объект может наследовать основные свойства другого объекта и добавлять к ним черты, характерные только для него.

Наследование является важным, поскольку оно позволяет поддерживать концепцию иерархии классов (hierarchical classification). Применение иерархии классов делает управляемыми большие потоки информации.

Разберем этот механизм на классическом примере: Геометрические фигуры.

У нас есть интерфейс Figure:

?

1

2

3

4

5

6

7

public interface Figure {

    public void draw ();

    public void erase ();

    public void move ();

    public String getColor ();

    public boolean setColor ();

}

Интерфейс (более детально будут рассмотрены в скором будущем) — нам говорит как должен выглядеть класс, какие методы в себе содержать, какими переменными и типами данных манипулировать. Сам интерфейс не реализует методы, а создает как бы скелет для класса который будет расширять этот интерфейс. Есть класс Figure который расширяет интерфейс Figure:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

public class Figure implements devcolibri.com.oop.inheritance.interfaces.Figure{

 

    @Override

    public void draw() {

       //need to implement

    }

 

    @Override

    public void erase() {

       //need to implement

    }    

 

    @Override      

    public void move(int pixel) {        

       //need to implement   

    }    

 

    @Override    

    public String getColor() {        

        return null;

    }    

 

    @Override    

    public boolean setColor(String colour) {        

        return false;

    }

}

В этом классе мы реализовываем все методы интерфейса Figure.

public class Figure implements devcolibri.com.oop.inheritance.interfaces.Figure — с помощью ключевого слова implements мы перенимаем методы интерфейса Figure для реализации.

Важно: в классе должны быть все методы интерфейса, даже если некоторые еще не реализованы, в противном случае компилятор будет выдавать ошибку и просить подключить все методы. Тело методов можно изменить только в интерфейсе, здесь только реализация. @Override — аннотация которая говорит что метод переопределен.

И соответственно у нас есть 3 класса саммых фигур которые наследуются от класса Figure. Класс Figure является родительским классом или классом родителем, а классы Circle, Rectungle и  Triangle — являются дочерними.

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

public class Circle extends Figure {

 

    @Override

    public void draw() {

       super.draw();

    }

 

   @Override

   public void erase() {

      super.erase();

   }

 

   @Override

   public void move(int pixel) {

       super.move(pixel);

   }

 

   @Override

   public String getColor() {

       return super.getColor();

   }

 

   @Override

   public boolean setColor(String colour) {

       return super.setColor(colour);

   }

}

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

public class Rectangle extends devcolibri.com.oop.inheritance.Figure{

 

    @Override

    public void draw() {

      super.draw();

    }

 

    @Override

    public void erase() {

       super.erase();

    }

 

    @Override

    public void move(int pixel) {

       super.move(pixel);

    }

 

    @Override

    public String getColor() {

       return super.getColor();

    }

 

    @Override

    public boolean setColor(String colour) {

       return super.setColor(colour);

   }

 

}

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

public class Triangle extends devcolibri.com.oop.inheritance.Figure{

 

    @Override

    public void draw() {

       super.draw();

    }

 

    @Override

    public void erase() {

       super.erase();

    } 

 

    @Override

    public void move(int pixel) {

       super.move(pixel);

    }

 

    @Override

    public String getColor() {

       return super.getColor();

    }

 

    @Override

    public boolean setColor(String colour) {

        return super.setColor(colour);

    }

}

public class Triangle extends devcolibri.com.oop.inheritance.Figure — это значит что класс Triangle наследует класс Figure.

super.setColor(colour); — super модификатор позволяющий вызывать методы из класса родителя.

Теперь каждый класс перенял свойства класса Figure. Что собственно это нам дало?

Значительно уменьшило время разработки классов самих фигур, дало доступ к полям и методам родительского класса.

Наверное возник вопрос: чем же extends отличается от implements?

Extends дает нам намного гибче подход. Мы используем только те методы что нам нужны, в любой момент мы можем изменить каркас и тело метода, или добавить совсем новый метод который возможно будет использовать информацию от класса родителя, а implements все лишь формирует тело класса.

В дочерних классах мы можем спокойно добавлять новые интересующие нас методы. Например мы хотим добавить в класс Triangle 2-а новых метода: flimHorizontal () и flipVertical ():

?

1

2

3

4

5

6

7

8

9

10

11

12

13

/**

* New Method

*/

public void flipVertical () {

 

};

 

/**

* New Method

*/

public void flipHorizontal () {

 

};

Теперь эти 2-а метода принадлежат сугубо классу Triangle. Этот подход используется когда базовый класс не может решить всех проблем.

Или можно использовать другой подход, изменить или переписать методы в дочерним классе:

Довольно интересный факт: в java запрещено множественное наследование, но любой из классов по умолчанию наследуется то класса Object. То есть при наследовании любого класса у нас получается множественное наследование)

Но не стоит забивать этим голову!