Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Приведение и проверка типов в C#.



 

Для проверки принадлежности объекта к какому-либо типу используется параметр is. Синтаксис записи следующий: <выражение> is <тип>. Результатом является либо true, либо false.

1) if (s1 is Cube)

Console.Writeline(“yes”);

else Console.Writeline(“no”); результат : “no”

2) if (s2 is Cube)           результат : “yes”

3) if (s2 is Square)        результат : “yes

4) if (s2 is Square         результат : “yes”

Приведение типов доступно в C#. Различают неявное (implicit) и явное (explicit) приведение типов (type-cast(ing)). Неявное приведение: автоматически:

Int i = 78;

Long l = I;

i неявно переводится к типу long, т.к. long охватывает большое число значений.

Явное приведение:

Long l = 45;

Int i = (int)l;

Т.к. int более короткий, чем long.

Class Overl

   {Public void f(int I, long l) {}

    Public void f(long l, int i) {}}

Overl O = new Overl();

Int i1=14, i2=24;

O.f(i1,i2); - ошибка

O.f((long)i1,i2); - 2-ой метод

O.f(i1,i2); - 1-ый метод

Для структурных типов – это единственный способ приведения. Этот же способ работает и для ссылочных типов. Для ссылочных типов существует еще один способ. Это использование оператора as.

C1 as Square = (Square) c1

Различия есть: 1) (Cube) s1; 2) s1 as Cube

(Cube)s1 – s1 не является объектом Cube. В первом случае возникает исключительная ситуация System.InvalidCasrException. Оператор as действует по другому: сначала выполняется проверка на соответствие типов, т.е. вызывается оператор is. Если тип преобразовать невозможно, исключение не возникает, а результатом будет нулевая ссылка null.



Абстрактные классы в C#.

Часто при анализе предметной области выясняется, что в классах, объединенных иерархией наследования, можно выделить особенности, общие для всех классов. Например, у каждой фигуры на плоскости можно узнать площадь и периметр и т.д. Для того, чтобы не реализовывать эти особенности для каждого класса в иерархии, это удобно сделать в базовом классе, а после пользоваться этой реализацией в производных классах. При этом может оказаться так, что объекты базового класса не будут соответствовать никаким или процессам реального мира. Если создан класс, объекты которого не могут существовать, то такой класс должен быть описан абстрактным с помощью модификатора abstract. Объекты абстрактных классов не могут быть созданы в программе. Ошибке является одновременное использование модификатора abstract и sealed. Хотя объекты абстрактных классов не могут быть созданы, можно описывать конструкторы абстрактного класса – позже они будут вызываться из потомков. Класс может быть объявлен на любом уровне иерархии.

Абстрактные методы. При реализации потомков программист может забыть добавить свою реализацию, и вся программа будет работать неверно. Для того, чтобы избежать такого рода логических ошибок, в C# было введено понятие абстрактного метода. Эти методы определяются с помощью ключевого слова abstract. Особенности абстрактных методов следующие: 1) могут быть определены только в пределах абстрактного класса; 2)абстрактный метод неявно является виртуальным (virtual); 3) явное объявление абстрактного метода виртуальным является синтаксической ошибкой; 4) к абстрактным методам нельзя применять модификатор static; 5) в С# нельзя определить реализацию абстрактного метода (в отличии от С++, где можно было задать тело чисто виртуального метода); 6) абстрактные методы, как и вирт. не могут быть определены закрытыми (private).

abstract public class Shape

{ abstract public int Area(); }

В абстрактном классе может быть определено любое количество данных и неабстрактных методов.

Св-ва также могут быть абстр. При определении абстр. св-а необходимо указать возможные блоки доступа. В производ. классе можно переопред. только те блоки, которые были заданы в базовом.

Виртуальный метод может быть переопределен в классе-потомке, абстр. метод должен быть переопределен. Поэтому использование абстр. методов иногда наз. принудительным полиморфизмом.

 



Интерфейсы в С#.

Интерфейс – абстрактный класс, в котором кроме открытых абстрактных методов, свойств и событий, индексаторов нет других компонентов. Интерфейс определяет, что может сделать класс, но он не определяет, как это будет сделано. Для определения интерфейса используется ключевое слово interface.

Public interface IPlayer

{void Play();

Viod Stop();

Void Forward();

}

Интерфейс – ссылочный тип данных. В нем можно определить методы, свойства, индексаторы и события. Каждый компонент интерфейса является неявно абстрактным, модификатор доступа неявно public. Явно все это в интерфейсе не указывается. Имя интерфейса принято начинать с I. Для интерфейсов возможно наследование, синтаксис такой же, как для классов. Но в отличие от классов допустимо множественное наследование.

Public interface IBase1

{void MethodA();}

Public interface IBase2

{void MethodB();}

Public interface IMyInterface: Ibase1, IBase2

{void MethodC();}

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



Виды массивов в C#.

Массив – индексированный набор элементов одного типа. В С# индексация начинается с нуля и изменить это нельзя. Для реализации массивов в C# существует класс System.Array. Для него реализована встроенная поддержка.

Тип [] имя_переменной


Int [] a1 = new int [10];

Int [] a2 = {1,2,3};

Int [] a3 = new int[] {1,2,3,4};

Int [] a4 = new int [4] {1,2,3,4};


В первом случае создается массив из заданного количества элементов(10), инициализация значений по умолчанию. Следующие 3 способа абсолютно одинаковы. Массив задается определением его элементов явно. В любом случае длина массива задается при его создании, а не определении. Для указания длины массива обычно используются константы, но это м.б. и переменная или выражение, если не определяется значение его элементов. Возможно создание массивов структур, объектов, классов и интерфейсов. Если не инициализировать элементы массивов ссылочных типов, то каждый элемент будет содержать нулевую ссылку null. Место в куче под каждый элемент требуется выделять отдельно.

Class MyClass

MyClass [] ac = {new MuClass(), newMyClass, newMyClass(2)};

или


MyClass [] ac = new MyClas[3];

Ac [0] = newMyClass();

Ac[1] = newMyClass();

Ac[2]= newMyClass();


Прямоугольные массивы – это массивы с 2 и более измерениями.

Тип [,] имя

Тип [, ,] имя

Int [,] aa5 = new int [3,4];

Int [,] aa6 = {{2,3},{4,5},{6,7}};

Int [,] aa7 = new int [3,2] {{2,3}, {4,5}, {6,7}};

Невыровненные массивы( jagged arrays )-массив массивовневыровненный потому, что сотавляющие его массивы могут иметь различную длину.

Тип [] имя

Int [] [] ja = new int [4] [];

Ja[0] = new int [2];

Ja[1] = new int [4];

Ja[2] = new int [3];

Обращение к неинициализированному элементу массива приводит к возникновению исключения System.NullReferenceException.


Поделиться:



Последнее изменение этой страницы: 2019-03-22; Просмотров: 285; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.023 с.)
Главная | Случайная страница | Обратная связь