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

Тема 3.

Пример 3.

Правила вызова методов

Если метод не виртуальный, то выз-ся метод типа (класса), на который указывала ссылка в момент ее объявл-я.

Если метод явл-ся виртуальным, то при вып-ии кода будет провер-ся, куда на самом деле указ-ся ссылка(на какой именно О.). Затем провер-ся экземпляром, какого класса явл-ся этот О. и выз-ся соответствующий метод этого класса.

using System;

namespace Console

{

class CA

{

string nameClass;

public CA()

{

nameClass = ‘Class CA’;

}

public void Fnc()

{

Console.WriteLine(nameClass + ‘Fnc()’);

}

public virtual void Fvrt ()

{

Console.EriteLine(nameClass + ‘Fvrt()’);

}

}

class CB: CA

{

string nameClass;

public CB()

{

nameClass = ‘Class CB’;

}

public new void Fnc()

{

Console.WriteLine(nameClass + ‘Fnc()’);

}

public override void Fvrt()

{

Console.WriteLine(nameClass + ‘Fvrt()’);

}

}

class Class1

{

static void Shw(CA m)

{

Console.WriteLine(‘Связывание’);

m.Fnc(); //раннесвязывание

m.Fvrt(); // позднеесвязывание

}

static void Main (string[] args)

{

CA a = new CA();

CB b = new CB();

a.Fnc();

a.Fvrt();

b.Fnc();

b.Fvrt();

Shw(a);

Shw(b);

}

}

}

В приведённом примере в классе родителе и производном классе содержаться ф-ии с одинаковыми именами. Одна из этих ф-й Fvrtявл-ся виртуальной и переопр-ся в производном классе. Поэтому ф-ии Shwтранслятор должен при вызове ф-ии Fwrtисп-ть механизм позднего связывания. Какая именно ф-я Fvrtкласса CAили класса СВ будет вызвана на этапе вып-я приложения зависит от О. который передается ф-ии Shwв виде ссылки в качестве аргумента. Невиртулаьную ф-ю Fncтранслятор жестко свяжет на этапе компиляции с классом СА. Так как ф-я Shw принимает в качестве параметра ссылку на класс СА.



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

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

Н-р:

abstract void func();

Исп-е virtualсовместно с abstractнедопустимо – пиведет к возникновению ошибки на этапе трансляции.

Abstractне применим к static.

Класс, содержащий один или более методов abstract, также должен быть объявлен как абстрактный:

abstract class abstr

{

int x;

public abstract void func();

}

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

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: