Читаем C#. Объектно ориентированное программирование полностью

Метод с таким же именем и атрибутами наследуется из класса A. Для мето-

да show() в классе B также указан атрибут new. Метод show() в классе B тоже

отображает значение текстового поля name, и это как раз то поле, которое

описано в классе B. Также метод выводит сообщение с информацией о том,

Замещение членов класса и переопределение методов           89

что метод описан именно в классе B. Благодаря этому мы легко сможем

определить, метод какого класса вызывается.

Конструктор класса B принимает два текстовых аргумента (обозначены

как txtA и txtB). Первый аргумент конструктора txtA передается аргумен-

том конструктору базового класса (инструкция base(txtA) в заголовке

конструктора). Текстовое значение txtA будет присвоено тому полю name, которое наследуется из базового класса A. Здесь еще раз хочется отметить, что замещение поля не означает его отсутствия. Аргумент txtB присваива-

ется в качестве значения полю name, описанному в классе B.

Еще у класса B есть оригинальный метод showAll(), который позволяет со-

ставить достаточно полное впечатление о том, что есть у класса B, а чего

у него нет. Особенность метода в том, что в нем выполняется обращение

как к замещенным членам, так и к замещаемым. Например, инструкции

name и show() означают обращение, соответственно, к полю и методу, опи-

санным в классе B. Инструкции base.name и base.show() означают обраще-

ние к полю и методу, описанным в классе A.

В главном методе программы командой B objB=new B("поле класса А","поле

класса В") мы создаем объект objB класса B со значениями полей name, равными "поле класса А" (для поля из класса A) и "поле класса В" (для

поля из класса B). После этого командой objB.showAll() вызываем метод

showAll(), который позволяет проверить корректность работы программ-

ного кода. Результат представлен на рис. 2.6.

Рис. 2.6.  Замещение членов класса при наследовании: результат выполнения программы

Сообщения в консольном окне говорят сами за себя. Но это еще не все.

В главном методе мы выполнили еще несколько незначительных на пер-

вый взгляд команд, последствием выполнения которых являются две по-

следние строки в консольном окне на рис. 2.6. А именно, мы объявили объ-

ектную переменную objA класса A и затем командой objA=objB в качестве

значения присвоили ей ссылку на объект objB. Затем мы вызываем метод

show() двумя разными способами: командой objB.show() через объектную

90

Глава 2. Классы и объекты

переменную objB класса B и командой objA.show() через объектную пере-

менную objA класса A. Что здесь интересного? Интересно вот что: мы уже

знаем, что для объекта класса B обращение show() означает вызов метода, описанного в этом классе. С другой стороны, через переменную класса A мы

имеем доступ только к тем членам и методам, которые определены в классе

A. Что же победит — опыт или молодость? Здесь, в отличие от классиче-

ского сюжета, побеждает опыт. В результате выполнения команды objB.

show() вызывается метод show() из класса B, а в результате выполнения

команды objA.show() вызывается метод show() из класса A. Аналогичная

ситуация имела бы место, если бы мы попробовали обратиться к полю name через объектные переменные obA и objB. Таким образом, при замещении

членов класса вопрос о том, какой вариант метода вызывается или какой

экземпляр поля запрашивается, решается на основе типа объектной пере-

менной. Это не очень хорошая новость. С точки зрения парадигмы ООП

такое положение дел в отношении методов, будь оно единственно возмож-

ным, поставило бы крест на многих полезных начинаниях. Естественно, из

ситуации имеется выход. Связан он с использованием виртуальных мето-

дов, допускающих переопределение в производных классах.

Уделим внимание изучению методики переопределения методов при на-

следовании. Сначала кратко изложим суть дела. Она такова: можно не

только замещать методы в производном классе, но и добиваться того, что

при вызове метода через объектную переменную базового класса вызыва-

лась не старая, базовая версия метода, а новая, переопределенная. Для это-

го нужно сделать две вещи:

 В базовом классе объявить метод, который мы планируем (или раз-

решаем — как посмотреть) переопределять в производных классах, как

виртуальный. Для этого в заголовок метода достаточно включить клю-

чевое слово virtual.

 В производном классе, в случае необходимости, переопределить вир-

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

переопределении метода в его заголовок добавляется ключевое слово

override.

Теперь посмотрим, как все это выглядит на практике. Обратимся к про-

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

Листинг 2.9.  Переопределение виртуальных методов

using System;

// Базовый класс с полем и методом:

class A{

// Открытое текстовое поле:

public string name;

// Конструктор класса:

public A(string txt){

Замещение членов класса и переопределение методов           91

name=txt;

}

// Открытый виртуальный метод для

// отображения значения поля:

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных