Виртуальные методы и их переопределение

Виртуальным наз.метод, объявленный с помощью слова virtual в базовом классе и переопределяемый в одном или нескольких производных классах. Каждый производный класс может иметь свою собственную версию реализации виртуального метода. Именно ч-з ссылку на базовый класс будет вызываться необходимая версия виртуального метода. По типу объекта, на который указывает ссылка, и вызывается нужный метод. Причем решение принимается динамически, т.е.во время выполнения программы. При определении виртуального метода пишут: public virtual <тип возврата>Имя метода(…){ … } При переопределении вирт.метода в производном классе пишут public override <тип возврата>Имя метода(…){…} Переопределение метода наз.замещением метода. Примечания: 1.при переопределении метода сигнатуры(списки параметров) и типы возвратов у вирт.метода и метода-заменителя должны совпадать. 2.вирт. метод нельзя определять как static-метод 3.вирт.метод переопределять не обязательно. В этом случае будет выполняться версия определенная в базовом классе . 4.свойства можно разрабатывать со словом virtual, а затем с помощью слова override переопределять их в производном классе. Переопределение вирт.метода –основа для одной из самых мощных концепций С#: динамической диспетчеризации метода. – это механизм метода во время выполнения программы, а не в период компиляции. Благодаря такому механизму реализ-ся: динамический полиморфизм и наследование. Сочетая наследование с возможностью переопределения методов в базовом классе можно определить общую форму методов, кот.будет использ. Производными классами. Например, в классе Figura можно разработать вирт. методы Площадь и Периметр, и переопределять их в производных классах.

Абстрактные классы.

Иногда создают класс, определяющий своего рода пустой бланк. Производные классы этого базового класса должны «заполнить» бланк своей инфо. Такой класс не обеспечивает реализацию одного или нескольких методов. Он просто говорит о том, что будет метод с таким-то именем. Можно заставить производные классы переопределить методы, кот.в базовом не имеют никакого смысла. Для этого и служат абстрактные методы, кот.записываются: abstract Тип возврата Имя_ метода(сигнатуры);

абстрактный метод не содержит тела и, следовательно, не реализуется базовым классом. Поэтому производный класс должен его переопределить. Абстр.метод автоматически явл.виртуальным. поэтому virtual писать не надо. Примечание: 1.модификатор abstract использ. только для обычных методов, а не для static-методов. 2.свойства также могут быть абстрактными. 3.класс, содержащий 1 или несколько абстрактных методов д.б. объявлен как абстрактный (перед Class- abstract) 4.нельзя создавать объекты абстрактного класса,т.к. он полностью нереализуем.

Переопределение методов класса Object.Class Object явл.неявным базовым классом всех других классов и типов данных(int,long). Это зн., что переменные типа Object может указывать на объект любого типа. Этот класс имеет несколько методов. Например, метод Equals(Object Ob1, Object Ob2) определяет: является ли объект Ob1 таким же как объект Ob2, но он для получения результата вызывает перегруженный метод Equals (Object Ob), кот.определяет является ли вызывающий таким же как объект parameter, а точнее являются ли ссылки вызывающего объекта и объекта-аргумента одинаковыми. Когда сравниваются(==,!=) 2 объекта, то вызывается метод Equals из базового класса. По умолчанию он не знает объект какого класса к нему поступил. Поэтому в производном классе, где будут операторы сравнения, нужно переопределить методы Equals и GetHashCode() public override bool Equals(Object Ob)

{ if (!(Ob is Point)) return false; else return this==(Point)Ob; } Роль метода GetHashCode(): возвратить числовое значение, кот. идентифицирует объект в памяти в зависимости от его состояния. Если объекты по содержанию одинаковы, то у них будет одинаковый GetHashCode public override int GetHashCode()

{return ToString().GetHashCode(); }


Наши рекомендации