Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




Наследование реализации

Для объявления, что класс наследуется от другого класса, применяется следующий синтаксис:

class УнаследованныйКласс: БазовыйКласс{ //Данные-члены и функции-члены}

Этот синтаксис очень похож на синтаксис C++ и Java. Однако программисты на C++, знакомые с концепцией общедоступного и приватного наследования, должны обратить внимание, что С# не поддерживает приватного наследования; этим объясняется отсутствие квалификатора public или private перед именем базового класса. Поддержка приватного наследования значительно усложняет язык, при этом принося весьма небольшую выгоду. На практике приватное наследование в C++ все равно используется чрезвычайно редко. Если класс также наследует интерфейсы, то список базового класса и интерфейсов

разделяется запятыми:

public class MyDerivedClass: MyBaseClass, Ilnterfacel, IInterface2{ // и т.д.}

Для структур синтаксис выглядит так:

public struct MyDerivedStruct: Ilnterfacel, IInterface2 { // и т.д. }

Если при определении класса базовый класс не указан, то компилятор С# предполагает, что базовым классом является System.Object. Поэтому следующие два фрагмента кода эквивалентны:

class MyClass: Object // наследуется от System.Object { // и т.д. }

и

class MyClass // наследуется от System.Object{// и т.д.}

Для простоты чаще применяется вторая форма.

Поскольку в С# поддерживается ключевое слово object, служащее псевдонимом класса System.Object, можно записать и так:

class MyClass: object // наследуется от System.Object{// и т.д.}

Чтобы сослаться на класс Object, используйте ключевое слово object, которое распознается интеллектуальными редакторами вроде Visual Studio.NET. Это облегчит редактирование кода.

Объявляя функцию базового класса как virtual, вы тем самым позволяете ее переопределять в классах-наследниках:

class MyBaseClass { public virtual string VirtualMethod () { return "Это - виртуальный метод, определенный в MyBaseClass"; } }

Также допускается объявление свойства как virtual. Для виртуального или переопределенного свойства используется такой же синтаксис, что и для невиртуального свойства, за исключением ключевого слова virtual, добавляемого к определению. Синтаксис выглядит следующим образом:

public virtual string ForeName{ get { return foreName; } set { foreName = value; }}private string foreName;

Для простоты далее речь пойдет в основном о методах, хотя все сведения касаются также и свойств. Концепция, лежащая в основе виртуальных функций С#, идентична стандартной концепции ООП. Виртуальную функцию можно переопределить в классе-наследнике, и когда этот метод будет вызван, запустится его версия, относящаяся к соответствующему типу объекта. В С# по умолчанию функции не являются виртуальными, но (в отличие от конструкторов) могут быть явно объявлены как virtual. Это следует методологии C++: по причинам, связанным с производительностью, функции не виртуальные, если это не указано явно. В отличие от этого, в Java все функции виртуальные. С# имеет отличающийся от C++ синтаксис, поскольку требует явного объявления, когда функция класса-наследника переопределяет другую функцию, с помощью ключевого слова override:

class MyDerivedClass: MyBaseClass { public override string VirtualMethod() { return "Этот переопределенный метод объявлен в MyDerivedClass"; } } class Program { static void Main(string[] args) { MyBaseClass x = new MyBaseClass(); Console.WriteLine(x.VirtualMethod()); MyDerivedClass y = new MyDerivedClass(); Console.WriteLine(y.VirtualMethod()); Console.ReadLine(); } }

Этот синтаксис переопределения метода исключает потенциальные ошибки времени выполнения, которые могут легко возникать в C++, когда сигнатура метода в классе-наследнике непреднамеренно оказывается отличной от базовой версии, в результате чего метод наследника не может переопределить базовый метод. В С# это всплывает в виде ошибки компиляции, поскольку компилятор легко обнаруживает метод, для которого указан модификатор override, но при этом не имеющий базового метода, который он переопределяет.

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




Поделиться с друзьями:


Дата добавления: 2013-12-12; Просмотров: 385; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.