Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_K_Magistrature.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
508.41 Кб
Скачать

10. Статические и виртуальные методы класса. Иерархические библиотеки классов.

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

По умолчанию методы не являются виртуальными. Такой метод нельзя переопределить.

Модификатор virtual нельзя использовать с модификаторами static, abstract, private или override.

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

-Использование модификатора virtual в статическом свойстве является недопустимым.

-Виртуальное наследуемое свойство может быть переопределено в производном классе путем включения объявления свойства, которое использует модификатор override.

Нельзя создавать экземпляры статического класса. Другими словами, нельзя использовать ключевое слово new для создания переменной типа класса. Поскольку нет переменной экземпляра, доступ к членам статического класса осуществляется с использованием самого имени класса.

Следующий список предоставляет основные характеристики статического класса:

-Содержит только статические члены.

-Создавать его экземпляры нельзя.

-Он закрыт.

Не может содержать конструкторов экземпляров.

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

Статический метод Нестатический класс может содержать статические методы, поля, свойства или события. Статический член вызывается для класса даже в том случае, если не создано экземпляра класса. Доступ к статическому члены всегда выполняется по имени класса, а не экземпляра. Существует только одна копия статического члена, независимо от того, сколько создано экземпляров класса. Статические методы и свойства не могут обращаться к нестатическим полям и событиям в их содержащем типе, и они не могут обращаться к переменной экземпляра объекта, если он не передается явно в параметре метода.

Для объявления статических методов класса используется ключевое слово static перед возвращаемым типом члена.

Библиотека классов .NET Framework содержит все классы, интерфейсы и типы значений, входящие в Microsoft .NET Framework. Эта библиотека предоставляет разработчикам доступ к системным средствам. Она разрабатывалась как основа для создания приложений, компонентов и элементов управления .NET Framework.

В типах .NET Framework используется иерархическая схема именования с точкой. При таком подходе связанные типы группируются в пространства имен, что упрощает их поиск и создание ссылок. Первая часть полного имени — до крайней правой точки — это имя пространства имен. Последняя часть имени — это имя типа. Например System.Collections.ArrayList представляет собой тип ArrayList, который принадлежит пространству имен System.Collections. Типы в System.Collections можно использовать для работы с коллекциями объектов.

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

11. Абстрактные методы и абстрактные классы. Интерфейсы. Использование интерфейсов и абстрактных классов в языках С ++

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

Класс, содержащий хотя бы один чисто виртуальный метод, называется абстрактным. Абстрактные классы предназначены для представления общих понятий, которые предполагается конкретизировать в производимых классах. Абстрактный класс может использоваться только в качестве базового для других классов — объекты абстрактного класса создавать нельзя, поскольку прямой или косвенный вызов чисто виртуального метода приводит к ошибке при выполнении.

При определении абстрактного класса необходимо иметь в виду следующее:

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

допускается объявлять указатели и ссылки на абстрактный класс, если при инициализации не требуется создавать временный объект;

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

Таким образом, можно создать функцию, параметром которой является указатель на абстрактный класс. На место этого параметра при выполнении программы может передаваться указатель на объект любого производного класса. Это позволяет создавать полиморфные функции, работающие с объектом любого типа.

Модификатор abstract в объявлении класса указывает, что класс предназначен только для использования в качестве базового класса для других классов. Члены, помеченные как абстрактные или включенные в абстрактный класс, должны быть реализованы с помощью классов, производных от абстрактных классов.

Далее представлены возможности абстрактных классов.

-Создавать экземпляры абстрактного класса нельзя.

-Абстрактные классы могут содержать абстрактные методы и методы доступа.

-Абстрактный класс с модификатором sealed (Справочник по C#) изменить нельзя, поскольку эти два модификатора имеют взаимоисключающие значения.Модификатор sealed запрещает наследовать классу, в то время как модификатор abstract указывает, что класс обязан иметь производные классы.

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

Возможности абстрактных методов.

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

-Объявления абстрактных методов допускаются только в абстрактных классах.

Поскольку объявление абстрактного метода не предоставляет фактической реализации, тело метода отсутствует; объявление метода просто заканчивается двоеточием, а после сигнатуры ставить фигурные скобки ({ }) не нужно.Пример.

-Реализация предоставляется методом переопределения override (C# Reference), который является членом неабстрактного класса.

-Использование статических или виртуальных модификаторов в объявлении абстрактного метода является недопустимым.

Интерфейс содержит только сигнатуры методов, свойств, событий или индексаторов. Класс или структура, которые реализуют интерфейс, должны реализовать члены этого интерфейса, указанные в его определении.

Интерфейс способен наследовать от одного или нескольких базовых интерфейсов.

Если в списке базовых типов содержится базовый класс и интерфейсы, то базовый класс должен стоять в списке на первом месте.

Класс, реализующий интерфейс, может явным образом реализовывать члены этого интерфейса.Явно реализованный член можно вызвать только через экземпляр интерфейса, но не через экземпляр класса.

Абстрактный класс содержит по крайней мере один абстрактный метод (остальные методы могут быть нормальными)А интерфейс по определению не содержит "не-абстрактных" методов.

class Account {

public:

Account( double d ); // Constructor.

virtual double GetBalance(); // Obtain balance.

virtual void PrintBalance() = 0; // Pure virtual function.

private:

double _balance;

};

interface Interface_Nested_A {

void Function_2();

};

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]