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

Разработка и использование интерфейсов.

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

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

Независимые классы реализуют один интерфейс:

namespace Интерфейс

{interface IName {string type();}

class A : IName

{public string type() { return "A"; }}

class B : IName

{public string type() { return "B"; }}

class C : IName

{public string type() { return "C"; }}

class Program

{static void Main()

{IName[] imass = { new A(), new B(), new C()};

foreach (IName i in imass) Console.WriteLine(i.type());}}}

На экране: A B C

Делегаты.

Делегаты на C# являются особым классом, объект которого предназначен для размещения ссылки на какой-либо метод.

Использовать этот объект можно, как и объекты других «обычных» типов: объявлять, выделять память, передавать в метод в качестве аргумента. Существенным является то, что содержимое объекта – делегата можно определять во время исполнения кода, а значит, и выбор необходимого метода можно осуществлять динамически.

Любой объект типа delegate имеет в своём составе список методов, который, в принципе может быть нулевым. При этом методом Combine() или перегруженной операцией += этот список может быть расширен, а методом Remove() или операцией -= из него может быть удалён конкретный метод. В случае, когда методов несколько, они вызываются поочередно, в том порядке, в каком они добавлялись в список: Каждому передаётся один и тот же набор входных параметров; Если параметр передаётся по ссылке – изменённое значение будет

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

значение последнего метода из списка;

Метод GetInvocationLocationList() позволяет осуществить выборочный вызов методов объекта – делегата. Кроме этого, объекты – делегаты можно сравнивать между собой (на предмет наличия ссылок на одни и те же методы, в одном и том же порядке), использовать в операциях сложения (с другими

делегатами, конечно), вычитания. Фактически, так как объект – делегат является неизменяемым (как строка, например), каждый раз при его модификации создаётся новый объект, а старый уничтожается. Кроме этого, делегат, как объект сам может быть использован в качестве входного значения какого – либо метода.

Переменной типа делегат можно сначала присвоить одну функцию, поработать с ней, а затем присвоить другую функцию. Делегаты бывают разных типов. Тип делегата определяется типом и количеством параметров и типом возвращаемого значения. Это значит, что если, например, делегат типа void и у него только один параметр типа int, то в такой делегат мы можем записать только функцию типа void и с одним единственным параметром типа int.

Делегат объявляется:

delegate Тип Имя (тип1 имя1, тип2 имя2 …);

namespace test

{ delegate int MyFunc(int x); //Объявление делегата

class Test

{ //Первая функция.

static int f1(int x) { return x; }

//Вторая функция.

static int f2(int x) { return x * x; }

static void Main()

{ MyFunc f = new MyFunc(f1); //Созд. экземпляр делег

int a; //Ответ пользователя.

Console.WriteLine

("Выберите функцию:\n1.f1=x.\n2.f2=x*x");

string s = Console.ReadLine(); a = Convert.ToInt32(s);

switch (a)

{ case 1:

//Записываем в делегат 1-ю функцию.

f = new MyFunc(f1); break;

case 2:

//Записываем в делегат 2-ю функцию.

f = new MyFunc(f2); break; }

int x = 4;

Console.WriteLine("f({0})={1}", x, f(x)); } } }

На экране при выборе 1 функции пояавится 4, при выборе 2 функции – 16.

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