Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metoda_OOP.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.71 Mб
Скачать

4.2.2Вопросы сокрытия реализации

Важнейшим соображением при объектно-ориентированном проектировании является “отделение изменяющейся составляющей от постоянной”.

При реализации библиотечных или утилитных классов возникает необходимость обеспечить с одной стороны постоянство пользовательских методов, которое гарантирует программисту-пользователю, что при дальнейшем усовершенствовании библиотеки эти методы останутся неизменными и с другой стороны свободу разработчику для дальнейших изменений и улучшений.

Для решения этой проблемы в Java имеются спецификаторы доступа. Уровни контроля доступа от “полного” до “минимального” определяются с помощью ключевых слов: публичный - public, защищенный - protected, дружественный - “friendly” (не имеет ключевого слова) и приватный - private. Однако, концепция библиотеки компонент и контроля доступа к ним это еще не все. Существует вопрос - как хранить вместе связанные компоненты в модуле библиотеки. В Java это реализуется с помощью ключевого слова package (пакет), и спецификаторы доступа действуют в зависимости от того, находится ли класс в том же пакете или нет.

Предложение package обязательно должно находиться в начале исходного текста. Когда вы говорите:

package mypackage;

в начале файла, например, MyTest.java, то указываете, что эта единица компиляции находится в части библиотеки с именем mypackage, и публичный класс MyTest будет иметь полное имя mypackage.MyTest. Если в исходном тексте не указано явно имя пакета, то этот файл принадлежит пакету “по умолчанию” для текущей директории.

Имена пакетов в Java записываются маленькими буквами.

При использовании ключевого слова import загружается целевая библиотека:

import java.util.*

такое предложение загружает в программу пакет утилит, являющийся частью стандартной поставки Java.

Спецификаторы доступа:

  1. public – доступ к интерфейсу, следующее за ним объявление члена доступно всем;

  2. private – приватный доступ, никто не имеет права доступа к этому члену, за исключением его класса, при использовании внутри метода;

  3. protected – защищенный доступ, все классы которые унаследовали базовый класс имеют доступ к защищенным членам;

  4. дружественный” – доступ по умолчанию, все классы в текущем пакете имеют доступ к дружественным членам, но классы за пределами пакета видят такие члены как приватные (private).

Для расширения доступа к приватным полям класса, используют специальные методы. Для доступа на чтение в классе описывают public setter method, а для организации доступа на запись – public getter method, так называемые set- и get- методы доступа к полям класса.

Учитывая все выше сказанное, класс узла дерева может иметь следующий вид:

1 /**

2 * LinkedNode.java

3 */

4 package stu.jtap.labs.lab2;

5

6 /**

7 * Класс узла для организации дерева на основе списочной структуры

8 */

9 public class LinkedNode {

10 /*Данные узла*/

11 private Object data;

12 /* Ссылка на голову списка сыновей */

13 private LinkedNode son;

14 /* Ссылка на брата */

15 private LinkedNode brother;

16

17 /**

18 * Создает новый узел без данных

19 */

20 public LinkedNode() {

21 }

22

23 /**

24 * Создает новый узел с данными

25 * @param data данные узла

26 */

27 public LinkedNode(Object data) {

28 this.data = data;

29 }

30

31 /**

32 * Добавляет дочерний элемент

33 *

34 * @param data

35 * добавляемый элемент

36 * @return вновь созданный узел

37 */

38 public LinkedNode addSon(Object data) {

39 return null;

40 }

41 /**

42 * Удаляет дочерний элемент с заданными данными

43 * @param data данные удаляемого элемента

44 * @return данные удаленного элемента или

45 * <code>null</code> в случае неудачи

46 */

47 public Object delSon(Object data) {

48 return null;

49 }

50

51 /**

52 * Возвращает данные заданного узла

53 * @return данные

54 */

55 public Object getData() {

56 return data;

57 }

58

59 /**

60 * Устанавливает данные заданного узла

61 * @param data данные

62 */

63 public void setData(Object data) {

64 this.data = data;

65 }

66 /**

67 * Проверка статуса

68 * @return <code>true</code> в случае если элемент

69 * является <i>листом</i>

70 */

71 public boolean isLeaf() {

72 return son == null;

73 }

74 /**

75 * Проверка статуса

76 * @return <code>true</code> в случае если элемент

77 * является <i>узлом</i>

78 */

79 public boolean isNode() {

80 return !isLeaf();

81 }

82

83 /**

84 * Возвращает указатель на список сыновей

85 * @return LinkedNode

86 */

87 public LinkedNode getSon() {

88 return son;

89 }

90

91 /**

92 * Возвращает указатель на брата

93 * @return LinkedNode

94 */

95 public LinkedNode getBrother() {

96 return brother;

97 }

98

99 /**

100 * Returns a string representation of the object.

101 * @return String

102 */

103 public String toString() {

104 return "data: " + data;

105 }

106

107 }

108