Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpory_po_proge.docx
Скачиваний:
3
Добавлен:
25.09.2019
Размер:
70.06 Кб
Скачать

10. Интерфейсы: стандартные интерфейсы.

В библиотеке классов .Net определено множество стандартных интерфейсов, задающих желаемую функциональность объектов. Например, интерфейс IComparable задает метод сравнения объектов по принципу больше и меньше, что позволяет переопределить соответствующие операции в рамках класса, наследующего интерфейс IComparable. Реализация интерфейсов IEnumerable и IEnumerator дает возможность просматривать содержимое объекта с помощью оператора foreach.

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

Интерфейс IComparable определен в пространстве имен System и содержит единственный метод CompareTo, возвращающий результат сравнения двух объектов - текущего и переданного ему в качестве параметра:

interface IComparable

{ int CompareTo(object obj);}

Реализация данного метода должна возвращать:

  1. 0 - если текущий объект и параметр равны;

  2. отрицательное число, если текущий объект меньше параметра;

  3. положительное число, если текущий объект больше параметра.

// класс DemoPoint реализует стандартный интерфейс IComparable

class DemoPoint:IComparable

{ protected int x;

protected int y;

public DemoPoint ( int x, int y)

{ this.x=x; this.y=y; }

public void Show()

{ Console.WriteLine("точка на плоскости: ({0}, {1})",x, y); }

public double Dlina()

{ return Math.Sqrt(x*x+y*y); }

//реализация метода CompareTo

public int CompareTo (object obj)

{ DemoPoint b=(DemoPoint) obj; //преобразуем к типу DemoPoint

//определяем критерии сравнения текущего объекта с параметром в зависимости от удаленности точки от начала координат

if (this.Dlina()==b.Dlina()) return 0;

else if (this.Dlina()>b.Dlina()) return 1;

else return -1;}}

11. Структуры, как значимый тип данных.

В С# реализован тип данных, аналогичный классу, но который в отличие от классов является размерным типом. Таким типом является структура.

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

  1. определять конструктор по умолчанию, поскольку он определен неявно и присваивает всем своим элементам значения по умолчанию ;

  2. определять деструктор, поскольку это бессмысленно.

Синтаксис структуры:

[атрибуты][спецификаторы] struct имя_структуры [: интерфейсы]

{ тело_структуры}

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

Интерфейсы, реализуемые структурой, перечисляются через запятую.

Тело структуры может содержать: константы, поля, конструкторы, методы, свойства, индексаторы, операторные методы, вложенные типы и события.

Так как структуры не могут участвовать в иерархии, то для ее членов недопустимо использовать спецификаторы protected и protected internal. Методы структур не могут быть абстрактными и виртуальными. А переопределяться могут только те методы, которые унаследованы от базового класса object.

//описание структуры

struct SPoint: IComparable

{ public int x, y;

public SPoint (int x, int y)

{ this.x=a; this.y=y; }

public double Dlina() //метод

{ return Math.Sqrt(x*x+y*y);}

public override string ToString()

{ return "("+x.ToString()+", "+y.ToString()+")"; }

public int CompareTo (object obj)

{ SPoint b=(SPoint) obj;

if (this.Dlina()==b.Dlina()) return 0;

else if (this.Dlina()>b.Dlina()) return 1;

else return -1; }}

Так как структуры являются размерными типами, то присваивание одной структуры другой создает копию экземпляра структуры. Этот факт является важным отличием структуры от класса.

SPoint one=new SPoint(); //вызов конструктора по умолчанию

SPoint two=new SPoint(1,1); //вызов собственного конструктора

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]