
- •Введение
- •Создание простого приложения в ms Visual Studio
- •Отладка программы
- •Пошаговый режим
- •Точки останова
- •Безусловные точки останова
- •Условные точки останова
- •Просмотр переменных
- •Стек вызова функций
- •Разработка оконных приложений
- •Размещение компонентов на форме. Свойства компонента.
- •Компонент CheckBoxListBox
- •Переменные
- •Приведение типов
- •Операции, приоритет
- •Перегрузка операций
- •If(выражение_1) оператор_1
- •Циклы While
- •Цикл foreach
- •Программирование классов
- •Введение в классы и объекты в с#
- •Общий синтаксис класса
- •Поля и свойства
- •Использование переменного числа аргументов
- •Объявление объектов класса. Оператор new
- •Инциализация членов класса
- •Конструкторы и деструкторы
- •Ключевое слово this
- •Ключевое слово static
- •Наследование
- •Полиморфизм.
- •Абстрактные классы
- •Интерфейсы
- •Реализация интерфейсов
- •Интерфейсные свойства
- •Интерфейсные индексаторы
- •Массивы
- •Обработка исключительных ситуаций
- •Предварительная проверка параметров
- •Проверка кодов возврата функций и методов
- •Применение механизма исключений
- •Блоки try-catch
- •Применение блока finally
- •Массивы как коллекции
- •Коллекция ArrayList
Ключевое слово this
При вызове метода ему автоматически передается неявный аргумент, который является ссылкой на вызываемый объект (т.е. на объект, с данными которого будет работать этот метод). Эта ссылка называется this.
Поскольку this определен в классе, то область его действия – класс, в котором он определен. Фактически this является скрытым параметром класса, добавляемым самим компилятором к его определению.
В качестве примера используем конструктор из предыдущего примера:
public NewClass()
{
this.a = 100;
}
Эта запись будет эквивалентна следующей:
public NewClass()
{
a = 100;
}
т.к. при обращении к полям класса из его методов допустимо опустить ключевое слово this.
Достаточно часто this используется для возврата ссылки (в форме: return this;) на данный объект.
Ключевое слово static
Члены класса могут быть объявлены с модификатором static. Статический член класса может рассматриваться как глобальная переменная или функция, доступная в пределах области класса для всех объектов этого класса.
Данные-члены, объявленные с модификатором static, разделяются всеми объектами класса, так как на самом деле существует только один экземпляр этой переменной. Чаще всего статические переменные объявляются закрытыми и для доступа к ним используются функции-члены.
К статическим членам можно обращаться с помощью стандартного оператора точка (.).
Пример использования статических членов класса:
using System;
class NewClass
{
public int a;
static int count = 0;
public static int Count
{
get {return count;}
}
public NewClass()
{
count++;
a = 100; }}
class ConstrDemo
{
public static void Main()
{
NewClass c1 = new NewClass();
NewClass c2 = new NewClass();
Console.WriteLine(c1.a + “ ” + c2.Count);
}
}
Наследование
Наследование — один из трех фундаментальных принципов объектно-ориентированного программирования, поскольку именно благодаря ему возможно создание иерархических классификаций. Используя наследование, можно создать общий класс, который определяет характеристики, присущие множеству связанных элементов. Этот класс затем может быть унаследован другими, узкоспециализированными классами с добавлением в каждый из них своих, уникальных особенностей.
В языке С# класс, который наследуется, называется базовым. Класс, который наследует базовый класс, называется производным. Следовательно, производный класс — это специализированная версия базового класса. В производный класс, наследующий все переменные, методы, свойства, операторы и индексаторы, определенные в базовом классе, могут быть добавлены уникальные элементы.
С# поддерживает наследование, позволяя в объявление класса встраивать другой класс. Это реализуется посредством задания базового класса при объявлении производного. Лучше всего начать с примера. Рассмотрим класс TwoDShape, в котором определяются атрибуты "обобщенной" двумерной геометрической фигуры {например, квадрата, прямоугольника, треугольника и т.д.).
// Класс двумерных объектов, class TwoDShape {
public double width;
public double height;
public void showDiraO {
Console.WriteLine("Ширина и высота равны " + width + " и " + height);
)
}
Класс TwoDShape можно использовать в качестве базового (т.е. как стартовую площадку) для классов, которые описывают специфические типы двумерных объектов. Например, в следующей программе класс TwoDShape используется для выведения класса Triangle. Обратите внимание на то, как объявляется класс Triangle. // Простая иерархия классов.
using System;
// Класс двумерных объектов. class TwoDShape {
public double width;
public double height;
public void showDimO {
Console.WriteLine("Ширина и высота равны " + width + " и " + height);
>
)
II Класс Triangle выводится из класса TwoDShape. class Triangle : TwoDShape \
public string style; // Тип треугольника.
// Метод возвращает площадь треугольника, public double area() {
return width * height / 2;
}
// Отображаем тип треугольника, public void showStyleO {
Console.WriteLine("Треугольник " + style);
>
}
class Shapes {
public static void Main() ( Triangle tl - new Triangle(); Triangle t2 = new Triangle();
tl.width = 4.0;
tl.height = 4.0;
tl.style = "равнобедренный";
t2.width = 8.0;
t2.height - 12.0;
t2.style - "прямоугольный";
Console.WriteLine("Информация о tl: "); tl.showStyleO ; tl.showDimt);
Console.WriteLine("Площадь равна " + tl.area{)); Console.WriteLine();
Console.WriteLine("Информация о t2: "); 12.showStyleO ; t2.showDira();
Console.WriteLine("Площадь равна " + t2.area());
)
}
Вот результаты работы этой программы. Информация о t1: Треугольник равнобедренный Ширина и высота равны 4 и 4 Площадь равна 8
Информация о t2: Треугольник прямоугольный Ширина и высота равны 8 и 12 Площадь равна 48
В классе Triangle создается специфический тип объекта класса TwoDShape, в данном случае треугольник. Класс Triangle содержит все элементы класса TwoDShape и, кроме того, поле style, метод area () и метод showStyle О. В переменной style хранится описание типа треугольника, метод area о вычисляет и возвращает его площадь, а метод showStyle () отображает данные о типе треугольника.
Ниже приведен синтаксис, который используется в объявлении класса Triangle, чтобы сделать его производным от класса TwoDShape. | class Triangle : TwoDShape {Этот синтаксис можно обобщить. Если один класс наследует другой, то имя базового класса указывается после имени производного, причем имена классов разделяются двоеточием. В С# синтаксис наследования класса очень прост для запоминания и использования.
Поскольку класс Triangle включает все члены базового класса, TwoDShape, он может обращаться к членам width и height внутри метода агеа(). Кроме того, внутри метода Main () объекты tl и t2 могут прямо ссылаться на члены width и height, как если бы они были частью класса Triangle. Несмотря на то что класс TwoDShape является базовым для класса Triangle, это совершенно независимый и автономный класс. То, что его использует в качестве базового производный класс (классы), не означает невозможность использования его самого. Например, следующий фрагмент кода абсолютно легален:
TwoDShape shape = new TwoDShape();
shape.width = 10; shape.height = 20;
shape.showDim();
Безусловно, объект класса TwoDShape "ничего не знает" и не имеет права доступа К классу, производному от TwoDShape.
Общая форма объявления класса, который наследует базовый класс, имеет такой вид:
class имя_производного_класса : имя_базо&ого_класса { // тело класса
}
Для создаваемого производного класса можно указать только один базовый класс. В С# (в отличие от С++) не поддерживается наследование нескольких базовых классов в одном производном классе. Этот факт необходимо учитывать при переводе С++-кода на С#. Однако можно создать иерархию наследования, в которой один производный класс становится базовым для другого производного класса. И конечно же, ни один класс не может быть базовым (ни прямо, ни косвенно) для самого себя.
Основное достоинство наследования состоит в том, что, создав базовый класс, который определяет общие атрибуты для множества объектов, его можно использовать для создания любого числа более специализированных производных классов. В каждом производном классе можно затем точно "настроить" собственную классификацию. Вот, например, как из базового класса TwoDShape можно вывести производный класс, который инкапсулирует прямоугольники:
// Класс прямоугольников Rectangle, производный //от класса TwoDShape. class Rectangle : TwoDShape {
// Метод возвращает значение true, если // прямоугольник является квадратом, public bool isSquare О {
if(width == height) return true; return false;
)
II Метод возвращает значение площади прямоугольника, public double area О ( return width * height;
)
}
Класс Rectangle включает класс TwoDShape и добавляет метод isSquareO, который определяет, является ли прямоугольник квадратом, и метод агеа(), вычисляющий площадь прямоугольника.