Использование ключевого слова base для доступа к скрытому имени



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

подобно ссылке t h i s , за исключением того, что ссылка base всегда указывает на ба-

зовый класс производного класса, в котором она используется. В этом случае формат

ее записи такой:

base.член

Здесь в качестве элемента член можно указывать либо метод, либо переменную

экземпляра. Эта форма ссылки base наиболее применима в тех случаях, когда имя

члена в производном классе скрывает член с таким же именем в базовом классе. Рас-

смотрим следующую версию иерархии классов из предыдущего примера:

// Использование ссылки base для доступа к скрытому имени.

using System;

class A {

public int i = 0;

}

// Создаем производный класс,

class В : А {

new int i; // Эта переменная i скрывает i класса А.

public В(int a, int b) { !

base.i = а; // Так можно обратиться к i класса А.

i = b; // Переменная i в классе В.

}

public void show() {

// Эта инструкция отображает переменную i в классе А.

Console.WriteLine("i в базовом классе: " + base.i);

// Эта инструкция отображает переменную i в классе В.

Console.WriteLine("i в производном классе: " + i );

class UncoverName {

public static void Main() {

В ob = new В(1f 2 );

ob.show();

Результаты выполнения этой программы выглядят так: Ii в базовом классе: 1

i в производном классе: 2

Несмотря на то что переменная экземпляра i в классе В скрывает переменную i в

классе А, ссылка base позволяет получить доступ к i в базовом классе.

С помощью ссылки base также можно вызывать скрытые методы.


Java. Наследование: правила, синтаксис. Сокрытие имен.

 

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

Без использования иерархии классов, для каждого объекта пришлось бы задать все характеристики, которые бы полностью его определяли. Однако при использовании наследования можно описать объект путём определения того общего класса (или классов), к которому он относится, с теми специальными чертами, которые делают объект уникальным.

Основные принципы наследования классов:

Подкласс всегда наследует все свойства и методы, определенные в его надклассе.

Подкласс может переопределять наследуемые свойства и методы, а также создавать новые — и это никак не должно отражаться на одноименных свойствах и методах надкласса.

Подкласс должен иметь возможность вызывать родные методы надкласса даже в том случае, если переопределяет их.

Объекты подкласса должны инициализироваться только в момент своего создания.

 

Модификаторы доступаМодификаторы доступа можно рассматривать как с позиции инкапсуляции так и наследования.Если рассматривать с позиции наследования,то модификаторы доступапозволяют путем установки доступа указать члены класса, которые будут наследоваться классом наследником автоматически, а какие нет. Например, переменная или метод, объявленная как public в данном классе будет автоматически перениматься в классе потомке.

 

Модификатор доступа Область доступа
public Без ограничений
private Только из данного класса
protected Из данного класса и его потомков
Без модификатора Для всех классов данного пакета

 

Классы-адаптеры и внутренние классы как альтернатива множественному наследованию.

Большинство интерфейсов имеет больше, чем один метод. Даже если необходимо использовать только один метод, он все равно должен определить (пустыми) все остальные. Это загромождает программу и делает ее плохо читаемой. Для сокращения кода используются адаптеры и внутренние классы. Классы-адаптеры удобны для интерфейсов, имеющих более одного метода, поскольку определение всех функций для интерфейсов не относится к классам.

Как известно, в Java запрещено множественное наследование от классов, в отличие от интерфейсов. Что же делать, если пользователь хочет наследовать класс-адаптер и какой-то другой класс одновременно, например, Applet ? Решение этой проблемы состоит в применении внутреннего класса, расширяющего адаптер. Ниже приведен фрагмент кода с внутренним классом:

 

public class MyClass extends Applet

{
...

// Конструктор
MyClass()

{

addMouseListener(new MyAdapter());

}
...

// Внутренний класс, расширяющий адаптер.
class MyAdapter extends MouseAdapter

{
public void mouseClicked(MouseEvent e)

{
...//Код обработки события.
}
}
}

 

Можно еще больше сократить код, если использовать анонимное (без имени) определение внутреннего класса следующим образом.

public class MyClass extends Applet

{
...
// Конструктор
MyClass()
{
addMouseListener(new MouseAdapter()

{
public void mouseClicked(MouseEvent e)

{
...//Код обработки события
}
});
}
...
}

 


Дата добавления: 2018-05-13; просмотров: 367; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!