Учебно-методический комплекс общее количество часов 58 ч. Лекции 28 ч
Download 2.46 Mb.
|
Язык программирования C#
- Bu sahifa navigatsiya:
- 10.2. Неявная реализация интерфейса
interface имя_интерфейса : интерфейс1, интерфейса2,…, интерфейсаN
{ // объявления } На приведенной схеме интерфейс1, интерфейса2,…, интерфейсаN – имена ранее определенных интерфейсов. Покажем теперь пример простой иерархии интерфейсов. interface A { void meth1(); void meth2(); } interface B { int meth3(); int meth4(); } interface C : A, B { double meth5(); double meth6(); } Лист. 1.2 Здесь мы определили три интерфейса: A, B и C. В каждом из них объявлено по две функции, а интерфейс C помимо своих объявлений получает еще и объявления от интерфейсов A и B. Интерфейс может объявить в своем теле метод, сигнатура которого полностью совпадает с сигнатурой метода, ранее определенного в родительском интерфейсе. Это не является ошибкой, но при таком переопределении компилятор выдаст предупреждение о сокрытии унаследованного члена, избавиться от которого можно, поставив пред переопределяемым членом ключевое слово new. interface A { void meth1(); void meth2(); } interface B { void meth1(); void meth2(); } interface C : A, B { new void meth1(); new void meth2(); } Лист. 1.3 Приведенный пример аналогичен примеру в листинге 1.2. Но здесь у всех интерфейсов методы имеют одинаковую сигнатуру, и интерфейс C переопределяет имена методов так, что наследующие от него классы, объекты или другие интерфейсы будут считать, что методы принадлежат именно ему. Конфликт имен никак не сказывается на конечном интерфейсе так, как интерфейс не предоставляет никакой реализации методов. Решается же конфликт имен классом или структурой реализующей интерфейс. 10.2. Неявная реализация интерфейса Реализация классом или структурой членов интерфейса без дополнительных уточнений называется неявной. Неявная реализация позволяет вызывать члены интерфейса, реализованные классом или структурой, без дополнительных приведений. При неявной реализации все реализуемые члены должны иметь спецификатор public. Приведем пример интерфейса и его неявной реализации. Создадим для начала интерфейс IEmployee, который впоследствии и неявно реализуем. interface IEmployee { decimal Salary { get; set; } string FullName { get; } void Work(); } Лист. 1.4 Этот интерфейс содержит базовые функции сотрудника. Свойство Salary отвечает за получение и определение жалования. Свойство FullName возвращает полное имя сотрудника. И, наконец, метод Work заставляет сотрудника работать. Теперь создадим класс Charwoman, неявно реализующий интерфейс IEmployee. class Charwoman : Employee { string FirstName, FatherName, FamilyName; decimal _Salary; public Charwoman(string FirstName, string FatherName, string FamilyName) { this.FirstName = FirstName; this.FatherName = FatherName; this.FamilyName = FamilyName; } public decimal Salary { get { return _Salary; } set
_Salary = value; } } public string FullName { get { return (FamilyName + " " + FirstName + " " + FatherName); } } public void Work() { Console.WriteLine("Wipe Wipe"); } } Лист. 1.5 Этот класс полностью реализует интерфейс IEmployee, но методы объявлены, как будто никакого интерфейса нет. В этом и заключается смысл неявной реализации. Напишем теперь метод, принимающий в качестве формального параметра интерфейс IEmployee. Этому методу далее могут быть переданы любые объекты, реализующие интерфейс IEmployee, и он вызовет их конкретную реализацию. static void UseEmployee(IEmployee Employee) { Console.WriteLine("Имя: " + Employee.FullName); Console.WriteLine("Оклад: " + Employee.Salary); Employee.Work(); } Лист. 1.6 Метод UseEmployee принимает в качестве параметра объект класса, реализующего интерфейс IEmployee. Одним из бесконечного числа подобных классов может быть класс Charwoman, о котором метод UseEmployee ничего не знает, кроме того, что тот некоторым образом реализуем интерфейс IEmployee. Этим достигается полиморфизм посредством интерфейсов. В заключение напишем метод, тестирующий наш класс Charwoman и метод UseEmployee. static void Main(string[] args) { Charwoman charwoman = new Charwoman("Надежда", "Петрова", "Унитазова"); charwoman.Salary = 120000; UseEmployee(charwoman); } Лист. 1.7 В этом примере создается объект класса Charwoman и передается в метод UseEmployee. Вывод программы: Имя: Унитазова Надежда Петрова Оклад: 120000 Wipe Wipe Вывод 1.1 Download 2.46 Mb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling