- •1.Классы в с#: данные класса: поля и константы, спецификаторы доступа.
- •2. Классы в с#: методы класса, конструкторы и деструкторы.
- •3. Классы в c#: свойства класса, индексаторы.
- •4.Операции класса: перегрузка унарных и бинарных операций.
- •5.Операции класса: перегрузка операции преобразования типа.
- •6. Наследование классов, пример реализации механизма наследования.
- •7. Виртуальные методы класса
- •8. Абстрактные метода и классы, пример использования абстрактных классов.
- •9. Интерфейсы: пользовательские интерфейсы.
- •10. Интерфейсы: стандартные интерфейсы.
- •11. Структуры, как значимый тип данных.
- •12.Коллекции: классификация коллекций.
- •13. Коллекции: класс Stack.
- •14. Коллекции: класс Queue.
- •15. Коллекции: класс ArrayaList.
- •16.Коллекции: коллекция Hashtable.
- •17. Регулярные выражения, язык описания регулярных выражений.
- •18. Класс Regex и обработка текстовых данных.
- •19. Рекурсивные методы. Прямая рекурсия.
- •20. Рекурсивные методы. Косвенная рекурсия.
- •38. Обработка событий клавиатуры.
10. Интерфейсы: стандартные интерфейсы.
В библиотеке классов .Net определено множество стандартных интерфейсов, задающих желаемую функциональность объектов. Например, интерфейс IComparable задает метод сравнения объектов по принципу больше и меньше, что позволяет переопределить соответствующие операции в рамках класса, наследующего интерфейс IComparable. Реализация интерфейсов IEnumerable и IEnumerator дает возможность просматривать содержимое объекта с помощью оператора foreach.
Можно создавать собственные классы, реализующие стандартные интерфейсы, что позволит использовать объекты этих классов стандартными способами.
Интерфейс IComparable определен в пространстве имен System и содержит единственный метод CompareTo, возвращающий результат сравнения двух объектов - текущего и переданного ему в качестве параметра:
interface IComparable
{ int CompareTo(object obj);}
Реализация данного метода должна возвращать:
0 - если текущий объект и параметр равны;
отрицательное число, если текущий объект меньше параметра;
положительное число, если текущий объект больше параметра.
// класс 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. Структуры, как значимый тип данных.
В С# реализован тип данных, аналогичный классу, но который в отличие от классов является размерным типом. Таким типом является структура.
Так как структура является размерным типом, то экземпляр структуры хранит значение своих элементов, а не ссылки на них, и располагается в стеке данных, а не в куче. В связи с этим фактом структура не может участвовать в иерархии наследования, а может только реализовывать интерфейсы. Кроме того, структуре запрещено:
определять конструктор по умолчанию, поскольку он определен неявно и присваивает всем своим элементам значения по умолчанию ;
определять деструктор, поскольку это бессмысленно.
Синтаксис структуры:
[атрибуты][спецификаторы] 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); //вызов собственного конструктора