Вход/Регистрация
C# для профессионалов. Том II
вернуться

Ватсон Карли

Шрифт:

}

class MyClass : MyBaseClass {

 public override void DoSomething(int X) {

// и т.д.

 }

 // и т.д.

}

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

override
, и компилятор не сможет идентифицировать ее версию в каком-либо базовом классе.

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

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

new
.

class MyBaseClass {

 public void DoSomething(int X) {

// и т.д.

 }

 // и т.д.

}

class MyClass : MyBaseClass {

 public new void DoSomething(int X) {

// и т.д.

 } и т.д.

}

Если не пометить новую версию класса явно как

new
, то код по-прежнему будет компилироваться, но компилятор будет выдавать предупреждение. Предупреждение служит для защиты от любых трудноуловимых ошибок, возникающих во время выполнения. Например, когда написана новая версия базового класса, в которой добавлен метод, имеющий, оказывается, такое же имя, как и существующий метод в производном классе.

В C# можно объявить абстрактную функцию, также как это делается в C++ (в C++ она называются еще чисто виртуальной функцией), но в C# синтаксис будет отличаться: вместо использования

=0
в конце определения применяется ключевое слово
abstract
.

C++:

public:

 virtual void DoSomething(int X) = 0;

C#:

public abstract void Dosomething(int X);

Как и в C++, можно создать экземпляр класса, только если он сам не содержит абстрактных методов и предоставляет реализации всех абстрактных методов, которые были определены в любом из его базовых классов.

Структуры

Синтаксис определения структур в C# соответствует синтаксису определения классов.

struct MyStruct {

 private SomeField;

 public int SomeMethod {

return 2;

 }

}

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

struct
заменяет в определении
class
.

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

В отличие от классов в C#, структуры являются типом данных значений. Это означает, что такая инструкция как:

MyStruct Mine;

реально создает экземпляр

MyStruct
в стеке. Однако в C# этот экземпляр не инициализируется, если конструктор не вызван явно:

MyStruct Mine = new MyStruct;

Если все поля-члены из

MyStruct
являются открытыми, можно альтернативно инициализировать структуру, преобразуя каждое поле-член по отдельности.

Константы

Ключевое слово

const
в C++ имеет достаточно большой диапазон использования. Например, можно объявить переменные как
const
, тем самым указывая, что их значения обычно задаются во время компиляции и не могут изменяться никакой инструкцией присваивания во время выполнения (хотя существует небольшой элемент гибкости, так как значение члена переменной
const
может быть задано в списке инициализации конструктора, а это предполагает в данном случае, что значение может вычисляться во время выполнения). Можно также применять
const
к указателям и ссылкам, чтобы запретить их использование для изменения данных, на которые они указывают, и можно также использовать ключевое слово
const
для модификации определений параметров, передаваемых в функции. В этом случае
const
показывает, что переменная, которая была передана по ссылке или через указатель, не должна изменяться функцией. Как упоминалось ранее, сами члены функции тоже могут быть объявлены как
const
, чтобы подчеркнуть, что они не изменяют содержащий их экземпляр класса.

  • Читать дальше
  • 1
  • ...
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: