Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП.doc
Скачиваний:
1
Добавлен:
24.09.2019
Размер:
522.24 Кб
Скачать

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

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

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

На этапе компиляции строится только таблица виртуальных методов, а конкретный адрес проставляется уже на этапе выполнения.

При вызове метода - члена класса действуют следующие правила:

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

  • для невиртуального метода вызывается метод, соответствующий типу самой ссылки.

При позднем связывании определение вызываемого метода происходит на этапе выполнения (а не при компиляции) в зависимости от типа объекта, для которого вызывается виртуальный метод.

При раннем связывании определение вызываемого метода происходит на этапе компиляции.

Например:

using System;

namespace MyDerriv1

{

class Class1

{

static void Main(string[] args)

{

// Тип объекта и тип ссылки совпадают

CA var1; var1=new CA();

// Вызывается метод класса CA

Console.WriteLine (var1.F1());

// Вызывается метод класса CA

Console.WriteLine (var1.F2());

// Тип объекта - CB , а тип ссылки - CA

CA var2; var2=new CB();

// Вызывается метод класса CA

Console.WriteLine (var2.F1());

// Вызывается метод класса CB

Console.WriteLine (var2.F2());

}

}

}

// Класс CA

using System;

namespace MyDerriv1

{

public class CA

{ public CA() { }

public int F1() { return 1; }

public virtual string F2()

{return "Метод F2 класса CA";}

}

}

// Класс CB

using System;

namespace MyDerriv1

{ public class CB : MyDerriv1.CA

{

public CB() { }

public int F1() {return 2; }

// Переопределение виртуального метода F2

public override string F2()

{ return "Метод F2 класса CB"; }

}

}

Листинг 16.1. (html, txt)

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

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

Абстрактный класс не может использоваться для создания объектов.

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

Абстрактный метод языка C# не имеет тела метода и аналогичен чисто виртуальному методу языка C++.

Например:

public abstract int M1(int a, int b);

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

По умолчанию при создании абстрактного класса в среде VisualStudio .NET в формируемый абстрактный класс автоматически вставляется только один метод - конструктор без параметров.

Вопрос 10) Интерфейсы c#

Интерфейсы определяются с помощью ключевого слова interface, как показано в следующем примере.

interface IEquatable<T>

{

bool Equals(T obj);

}

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

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

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

  • Класс или структура может наследовать несколько интерфейсов.

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

public class Car : IEquatable<Car>

{

public string Make {get; set;}

public string Model { get; set; }

public string Year { get; set; }

// Implementation of IEquatable<T> interface

public bool Equals(Car car)

{

if (this.Make == car.Make &&

this.Model == car.Model &&

this.Year == car.Year)

{

return true;

}

else

return false;

}

}

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

Интерфейсы и члены интерфейсов являются абстрактными. Интерфейсы не имеют реализации по умолчанию.Дополнительные сведения см. в разделе Абстрактные и запечатанные классы и члены классов.

Интерфейс IEquatable<T> объявляет пользователю объекта, что объект может определять, равен ли он другому объекту такого же типа, причем пользователь интерфейса не должен знать, как именно это реализовано.

Интерфейсы могут наследовать другие интерфейсы.Класс может наследовать интерфейс несколько раз посредством наследуемых базовых классов или интерфейсов.В этом случае класс может реализовать интерфейс только один раз, если он объявляется частью нового класса.Если унаследованный интерфейс не объявлен как часть нового класса, его реализация предоставляется базовым классом, объявившим его.Базовый класс может реализовать члены интерфейса посредством виртуальных членов. В этом случае класс, наследующий интерфейс, может изменить поведение наследования путем переопределения виртуальных членов.Дополнительные сведения о виртуальных членах см. в разделе Полиморфизм.

Общие сведения об интерфейсах

Интерфейс имеет следующие свойства.

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

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

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

  • Интерфейсы не содержат реализации методов.

  • Как классы, так и структуры способны наследовать от нескольких интерфейсов.

  • Интерфейс может быть унаследован от нескольких интерфейсов.

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