
- •Введение
- •Создание простого приложения в ms Visual Studio
- •Отладка программы
- •Пошаговый режим
- •Точки останова
- •Безусловные точки останова
- •Условные точки останова
- •Просмотр переменных
- •Стек вызова функций
- •Разработка оконных приложений
- •Размещение компонентов на форме. Свойства компонента.
- •Компонент CheckBoxListBox
- •Переменные
- •Приведение типов
- •Операции, приоритет
- •Перегрузка операций
- •If(выражение_1) оператор_1
- •Циклы While
- •Цикл foreach
- •Программирование классов
- •Введение в классы и объекты в с#
- •Общий синтаксис класса
- •Поля и свойства
- •Использование переменного числа аргументов
- •Объявление объектов класса. Оператор new
- •Инциализация членов класса
- •Конструкторы и деструкторы
- •Ключевое слово this
- •Ключевое слово static
- •Наследование
- •Полиморфизм.
- •Абстрактные классы
- •Интерфейсы
- •Реализация интерфейсов
- •Интерфейсные свойства
- •Интерфейсные индексаторы
- •Массивы
- •Обработка исключительных ситуаций
- •Предварительная проверка параметров
- •Проверка кодов возврата функций и методов
- •Применение механизма исключений
- •Блоки try-catch
- •Применение блока finally
- •Массивы как коллекции
- •Коллекция ArrayList
Интерфейсные свойства
Как и методы, свойства определяются в интерфейсе без тела. Ниже приведен формат спецификации свойства.
// Интерфейсное свойство тип имя{
get;
set;
}
Свойства, предназначенные только для чтения или только для записи, содержат только get- или set-элемент, соответственно.
Рассмотрим еще одну версию интерфейса ISeries и класса ByTwos, в котором для получения следующего элемента ряда и его установки используется свойство.
// Использование свойства в интерфейсе.
using System;
public interface ISeries {// Интерфейсное свойство,
int next {
get; // Возвращает следующее число ряда,
set; // Устанавливает следующее число ряда.
}
}
// Реализация интерфейса ISeries, class ByTwos : ISeries f int val;
public ByTwos() { val = 0;
}
// Получаем или устанавливаем значение ряда,
public int next {
get {
val += 2;
return val;
}
set {
val = value;
}
}
//Демонстрируем использование интерфейсного свойства,
class SeriesDemo3 {
public static void Main() {
ByTwos ob - new ByTwos();
// Получаем доступ к ряду через свойство,
for(int i=0; i < 5; i++)
Console.WriteLine("Следующее значение равно " + ob.next);
Console.WriteLine("ХпКачинаем с числа 21");
ob.next = 21;
for(int i=0; i < 5; i++)
Console.WriteLine("Следующее значение равно " + ob.next);
}
}
Результаты выполнения этой программы таковы:
Следующее значение равно 2
Следующее значение равно 4
Следующее значение равно б
Следующее значение равно 8
Следующее значение равно 10
Начинаем с числа 21
Следующее значение равно 23
Следующее значение равно 25
Следующее значение равно 27
Следующее значение равно 29
Следующее значение равно 31
Интерфейсные индексаторы
В интерфейсе можно определить и индексатор. Объявление индексатора в интерфейсе имеет следующий формат записи:
// Интерфейсный индексатор тип_элемента this[int индекс]{
get;
set;
)
Индексаторы, предназначенные только для чтения или только для записи, содержат только get- или set-метод, соответственно.
Предлагаем еще одну версию интерфейса iSeries, в который добавлен индексатор, предназначенный только для чтения элемента ряда.
// Добавление в интерфейс индексатора.
using System;
public interface ISeries { // Интерфейсное свойство,
int next {
get; // Возвращает следующее число ряда,
set; // Устанавливает следующее число ряда.
}
// Интерфейсный индексатор,
int this[int index] {
get; // Возвращает заданный член ряда.
}
// Реализация интерфейса ISeries,
class ByTwos : ISeries {
int val;
public ByTwos() {
val = 0;
}
// Получаем или устанавливаем значение с помощью // свойства,
public int next { get {
val += 2;
return val;
}
set {
val = value;
}
}
// Получаем значение с помощью индексатора,
public int this[int index] {
get {
val = 0;
for (int i=0; i<index; i++)
val += 2; return val;
}
}
// Демонстрируем использование интерфейсного индексатора, class SeriesDemo4 {
public static void Main() { ByTwos ob = new ByTwos();
// Получаем доступ к ряду посредством свойства, for(int i-0; i < 5; i++}
Console.WriteLine("Следующее значение равно " + ob.next);
Console.WriteLine("\nНачинаем с числа 21");
ob.next = 21;
for(int i=0; i < 5; i++)
Console.WriteLine("Следующее значение равно " + ob.next);
Console.WriteLine("\nПереход в исходное состояние."); ob.next - 0;
// Получаем доступ к ряду посредством индексатора, for(int i-0; i < 5; i++)
Console.WriteLine("Следующее значение равно " + ob[i]);
}
)
Вот результаты, сгенерированные этой программой:
Следующее значение равно 2
Следующее значение равно 4
Следующее значение равно 6
Следующее значение равно 8
Следующее значение равно 10
Начинаем с числа 21
Следующее значение равно 23
Следующее значение равно 25
Следующее значение равно 27
Следующее значение равно 29
Следующее значение равно 31
Переход в исходное состояние.
Следующее значение равно 0
Следующее значение равно 2
Следующее значение равно 4
Следующее значение равно 6
Следующее значение равно 8
В Наследование интерфейсов
Один интерфейс может унаследовать "богатство" другого. Синтаксис этого механизма аналогичен синтаксису, используемому для наследования классов. Если класс реализует интерфейс, который наследует другой интерфейс, этот класс должен обеспечить способы реализации для всех членов, определенных внутри цепочки наследования интерфейсов. Рассмотрим такой пример:
// Один интерфейс может наследовать другой.
using System;
public interface A { void methl(); void meth2() ;
}
// Интерфейс В теперь включает методы methlО и meth2(),
// а также добавляет метод meth3().
public interface В : A {
void meth3 () ;
}
// Этот класс должен реализовать все методы
// интерфейсов А и В.
class MyClass : В {
public void methl() {
Console.WriteLine("Реализация метода methl().");
}
public void meth2() {
Console.WriteLine("Реализация метода meth2().");
}
public void meth3() {
Console.WriteLine("Реализация метода meth3().");
}
}
class IFExtend {
public static void Main() {
MyClass ob = new MyClassО;
ob.methlO;
ob.meth2() ; ob.meth3();
}
Если бы в качестве эксперимента вы попытались удалить метод methl (), реализованный в классе MyClass, то сразу же получили бы от компилятора сообщение об ошибке. Как упоминалось выше, любой класс, который реализует интерфейс, должен реализовать все методы, определенные этим интерфейсом, включая методы, которые унаследованы от других интерфейсов.