Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 71

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 65 66 67 68 69 70 < 71 > 72 73 74 75 76 77 .. 320 >> Следующая

It Создаем объект производного класса, используя собственный конструктор Manager списку - new Manager("Списку". 92, 10U000, "333-23-2322", 9000);
Б коде, представленном выше, мы используем пользовательский конструктор. Однако, внимательно посмотрев на список параметров, которые мы ему передаем, мы можем заметить, что большинство из них предназначено для установки значений тех внутренних данных, которые унаследованы из базового класса. Наш вариант конструктора для производного класса может выглядеть так:
// При созданий обьекта производного класса конструктор производного класса
// автоматически вызывает конструктор базового класса по умолчанию
public Manager(string fullName, int empID. float currPay, string ssn. ulong numbOfOpts)
^ Il Присваиваем значения уникальным данным нашего класса nuraberOf Opt ions = numbOfOpts:
// Присваиваем значения данным, унаследованным от базового класса Етрш - empID: SetFullName(full Мате); SSN=ssn; Pay = currPay;
}
Такое решение вполне допустимо, но с точки зрения производительности оно не является оптимальным. Все равно пользовательскому конструктору производного класса приходится вызывать конструктор базового класса (если иное не указано специально, будет вызван конструктор по умолчанию), который присвоит всем данным, за которые он «ответствен», безопасные значения по умолчанию. Только после этого в дело вступит пользовательский конструктор производного класса, который заново определит значения для унаследованных членов. Конечно, гораздо удобнее и эффективнее с точки зрения производительности
(а иногда это и просто единственный возможный способ) — сразу вызвать нужный вариант пользовательского конструктора базового класса. В С# имеются для этого средства:
// Обратите внимание на использование ключевого слова base для вызова пользовательского // конструктора базового класса
public Managerfstring fullName. int empID, float currPay. string ssn. ulong numbOfOpts)
: base(fullName, empID, currPay, ssn)
{
numberOfOptions = numbOfOpts;
}
Как мы видим, в объявлении нашего пользовательского конструктора производного класса появилось небольшое дополнение в виде двоеточия, следующего за ним ключевого слова base и перечня параметров в скобках. Все это означает, что будет вызван тот вариант конструктора базового класса, который принимает четыре параметра, и нам уже не потребуется присваивать значения унаследованным членам в конструкторе производного класса. С точки зрения производительности такое решение значительно эффективнее. Создание объекта класса Salesperson при использовании этого приема выглядит практически идентично:
Хранение «семейных тайн»: ключевое слово protected 161
// При создании объекта производного класса часто бывает выгодный явно указать вызываемый вариант конструктора базового класса
public SalesPersonCstring full Name, int emplD. float currPay, ssn) : base(fullName, empID. currPay, ssn)
І
thisnumberOtSa1es = ruimbOfSales:
}
Ключевое слово base можно использовать в любой ситуации, когда из upon; -водного класса необходимо обратиться к открытым или защищенным членам базового класса: применение этого ключевого слова не ограничено конструктором.
Можно ли производить наследование от нескольких базовых классов
Очень важно отметить, что в С# при создании производного класса в качестве базового класса можно указать только один класс. Это означает, что множественное наследование в С# запрещено. Разрешение множественного наследования порождает большое количество проблем, и именно поэтому при создании С# было принято решение от него отказаться. Однако программисты на С# имеют в своем распоряжении другую возможность: в С# можно производить один интерфейс от нескольких. Множественное наследование для интерфейсов не запрещено. Подробнее об этом будет рассказано в главе 4.
Хранение «семейных тайн»: ключевое слово protected
Как мы уже знаем, открытые члены класса (объявленные как publ ic) могут бать доступны откуда угодно. Закрытые члены класса (объявленные как private) могут быть доступны только из того объекта, в котором они явно определены. Однако в С#, как и в других современных объектно-ориентированных языках программирования, предусмотрен еще один модификатор области видимости: protected (защищенное).
При создании защищенных переменных или защищенных методов класса эти члены будут доступны напрямую как из собственного класса, так и из всех производных классов. Если вы хотите, чтобы наши производные классы Salesperson и Manager получили доступ напрямую к донным, определенным в базовом классе Employee, эти данные в Empl оуее должны быть определены следующим образом:
//Защищенные данные о состоянии
public class Employee
(
II Производные классы смогут напрямую обращаться к этой информации.
// Пользоватепи объектов класса - нет
protected string full Name:
protected int empID;
protected float currPay:
protected string ssn:
T
162 Глава 3 • С# и обьеетно-ориентированное программирование
С точки зрения пользователей объектов защищенные данные являются закрытыми (то есть protected для них будет эквивалентно private). Поэтому следующий код приведет лишь к сообщению об ошибке:
Предыдущая << 1 .. 65 66 67 68 69 70 < 71 > 72 73 74 75 76 77 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100