Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Наследование
Мощь ООП основана на наследовании. Когда построен полезный класс, он может многократно использоваться клиентами этого класса. Повторное использование – это одна из главных целей ООП. Но и для хороших классов неизбежно наступает момент, когда необходимо расширить возможности класса, придать ему новую функциональность, изменить интерфейс. Всякая попытка изменять сам работающий класс чревата большими неприятностями – могут перестать работать прекрасно работавшие программы, многим клиентам класса вовсе не нужен новый интерфейс и новые возможности. Здесь-то и приходит на выручку наследование. Существующий класс не меняется, но создается его потомок, продолжающий дело отца, только уже на новом уровне. Базовая идея, лежащая в основе классического наследования, заключается в том, что новые классы могут создаваться с использованием существующих классов в качестве отправной точки. Кроме того, наследование позволяет использовать классы, исходный код которых недоступен, но в которые требуется внести изменения. Класс, который наследуется, называется базовым, а класс, который наследует, — производным. Следовательно, производный класс представляет собой специализированный вариант базового класса. Класс потомок наследует все возможности родительского класса – все поля и все методы, открытую и закрытую часть класса, статическую и динамическую части класса. Потомок может не иметь прямого доступа ко всем наследуемым полям и методам. Поля и методы родительского класса, снабженные атрибутом private, хотя и наследуются, но являются закрытыми, и методы, создаваемые потомком, не могут к ним обращаться напрямую, а только через методы, наследованные от родителя. Хорошей стратегией при проектировании класса является использование модификатора доступа protected вместо модификатора private, разрешая потомкам класса прямой доступ ко всем полям и методам родительского класса. Конструктор родительского класса не является конструктором для потомка. Примеры: с конструкторами, со словами is и as Man/Woman, Wife/Husband. 1) Идентификация типов во время выполнения программы: использование операторов is, as, typeof. 2) Отражение и его использование для получения информации о методах, конструкторов типов, типов из сборок и автоматического распознавания типов. В простейшем случае объявление класса может выглядеть так: public class Derived: Parent { }Тело класса Derived пусто, но это вовсе не значит, что объекты этого класса не имеют полей и методов: они наследуют все поля и методы (кроме конструктора) класса Parent и поэтому могут делать все, что могут делать объекты родительского класса. Можно даже не создавать собственных конструкторов класса. В этом случае автоматически добавляется конструктор по умолчанию - конструктор без аргументов, который будет вызывать конструктор без аргументов родительского класса. Заметьте, такой конструктор у родителя должен быть, иначе возникнет ошибка. Родительский класс есть всегда. Если прямой родитель не задан, то таковым является класс object. Класс object неявно считается базовым классом для всех остальных классов и типов, включая и значимые типы. Иными словами, все остальные типы являются производными от object. Это, в частности, означает, что переменная ссылочного типа object может ссылаться на объект любого другого типа. Кроме того, переменная типа object может ссылаться на любой массив, поскольку в С# массивы реализуются как объекты. Формально имя object считается в С# еще одним обозначением класса System.Object, входящего в библиотеку классов для среды.NET Framework. Практическое значение этого в том, что помимо методов и свойств, которые вы определяете, также появляется доступ к множеству общедоступных и защищенных методов-членов, которые определены в классе Object. Эти методы присутствуют во всех определяемых классах.
|