Способы явного приведения типов и их отличия

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

(целевой_тип) выражение

Здесь целевой_тип обозначает тот тип, в который желательно преобразовать указанное выражение.Если приведение типов приводит к сужающему преобразованию, то часть информации может быть потеряна. Например, в результате приведения типа long к типу int часть информации потеряется, если значение типа long окажется больше диапазона представления чисел для типа int, поскольку старшие разряды этого числового значения отбрасываются. Когда же значение с плавающей точкой приводится к целочисленному, то в результате усечения теряется дробная часть этого числового значения. Так, если присвоить значение 1,23 целочисленной переменной, то в результате в ней останется лишь целая часть исходного числа (1), а дробная его часть (0,23) будет потеряна.

В пространстве имен System имеется класс Convert, который тоже может применяться для расширения и сужения данных:

byte sum = Convert.ToByte(var1 + var2);

Одно из преимуществ подхода с применением класса System.Convert связано с тем, что он позволяет выполнять преобразования между типами данных нейтральным к языку образом (например, синтаксис приведения типов в Visual Basic полностью отличается от предлагаемого для этой цели в C#). Однако, поскольку в C# есть операция явного преобразования, использование класса Convert для преобразования типов данных обычно является делом вкуса.

Модификаторы abstract, new и sealed в объявлении класса

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

Абстрактный класс служит только для порождения потомков. Как правило, в нем задается набор методов, которые каждый из потомков будет реализовывать по-своему. Абстрактные классы предназначены для представления общих понятий, которые предполагается конкретизировать в производных классах.

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

В С# есть ключевое слово sealed, позволяющее описать класс, от которого, в противоположность абстрактному, наследовать запрещается:

Sealed class Spirit

{

}

/ / class Monster : Spirit { ... } ошибка!

Большинство встроенных типов данных описано как sealed. Если необходимо использовать функциональность бесплодного класса, применяется не наследование, а вложение, или включение: в классе описывается поле соответствующего типа.

Вложение классов, когда один класс включает в себя поля, являющиеся классами, является альтернативой наследованию при проектировании.

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

При использовании в качестве модификатора объявления ключевое слово new явным образом скрывает члены, унаследованные от базового класса.При скрытии унаследованного члена его производная версия заменяет версию базового класса.Хотя члены можно скрывать без использования модификатора new, в этом случае появляется предупреждение компилятора.При использовании new для явного скрытия члена, предупреждение не появляется.

Для заголовков классов newможет использоваться для вложенных классов, чтобы скрыть явным образом вложенный класс предка.

Например:

Publicclass BaseC

{

Publicclass NestedC

{

publicint x = 200;

publicint y;

}

}

Publicclass DerivedC : BaseC

{

Newpublicclass NestedC

{

publicint x = 100;

publicint y;

publicint z;

}

Тут класс DerivedCимеет вложенный класс NestedC, который скрывает с помощью модификатора newявным образом аналогичный класс класса-предка BaseC.

Наши рекомендации