Конструкторы класса

Статические классы содержат только статические члены, в том числе и конструктор, которые храняться в памяти в единственном экземпляре. Поэтому создавать экземпляры класса нет смысла.

Чтобы подчеркнуть этот факт, в первой версии С# для статических классов создавали два конструктора, один - пустой закрытый (private) конструктор, второй - статический конструктор, не имеющий параметров. Первый конструктор предотвращал попытки создания экземпляров класса. Второй конструктор автоматически вызывается системой до первого обращения к любому элементу статического класса, выполняя необходимые действия по инициализации. Вышесказанное отражено в следующем примере:

class Demo{ static int a; static int b; private Demo(){} //закрытый конструктор static Demo() //статический конструктор { a=10; b=2; } public static void Print () { Console.WriteLine("{0}+{1}={2}",a,b,a+b); Console.WriteLine("{0}*{1}={2}",a,b,a*b); Console.WriteLine("{0}-{1}={2}",a,b,a-b); } } class Program{ static void Main() { //Demo S=new Demo(); //ошибка содать экземпляр класса нельзя Demo.Print(); }}

В версию 2.0 введена возможность описывать статический класс, то есть класс с модификатором static. Экземпляры такого класса создавать запрещено, и кроме того, от него запрещено наследовать. Все элементы такого класса должны явным образом объявляться с модификатором static (константы и вложенные типы классифицируются как статические элементы автоматически). Конструктор экземпляра для статического класса задавать запрещается.

static class Demo{ static int a=20; static int b=10; public static void Print () { Console.WriteLine("{0}+{1}={2}",a,b,a+b); Console.WriteLine("{0}*{1}={2}",a,b,a*b); Console.WriteLine("{0}-{1}={2}",a,b,a-b); } } class Program{ static void Main() { Demo.Print(); }}

Свойства

Иногда требуется создать поле, которое с одной стороны, должно быть доступно для использования, с другой стороны, возможность что-то сделать с этим полем имеет ограничения. Например, полю нельзя присваивать произвольное значение, а только значения из какого-то диапазона. Свойство предлагает простой и удобный способ решения этой проблемы.

Синтаксис свойства:

[атрибуты] [спецификаторы] тип имя_свойства{ [get код_доступа] [set код_доступа]}

Значения спецификаторов для свойств и методов аналогичны. Чаще всего свойства объявляются как открытые (со спецификатором public).

Код доступа представляет собой блоки операторов, которые выполняются при получении (get) или установке (set) свойства. Может отсутствовать либо часть get, либо set, но не обе одновременно. Если отсутствует часть set, то свойство доступно только для чтения. Если отсутствует часть get, то свойство доступно только для записи.

Рассмотрим пример работы со свойствами, обращая внимание на то, что синтаксически чтение и запись свойства выглядят почти как методы. При этом get должен содержать оператор return, возвращающий выражение, для типа которого должно существовать неявное преобразование к типу свойства.

class Circle { //закрытые поля int x; int y; int radius; public static string name = "Окружность"; public Circle(int x, int y, int r):this(r)//конструктор 1 { this.x = x; this.y = y; } public Circle(int r)//конструктор 2 { radius = r; } public void Print() { Console.Write(name); Console.WriteLine(" с центром в точке ({0},{1}) и радиусом {2}", x, y, radius); Console.WriteLine(); } public int X //свойство для обращения к полю x { get { return x; } set { x = value; } } public int Y //свойство для обращения к полю y { get { return y; } set { y = value; } } public int R //свойство для обращения к полю radius { get { return radius; } set { radius = value; } } public double P //свойство только для чтения { get { return 2* Math.PI *radius; } } public double S //свойство только для чтения { get { return Math.PI *radius*radius; } } } class Program { static void Main() { Circle a = new Circle(0, 0, 1); //вызов конструктора a.Print(); //установка новых значений a.X=1; a.Y=1; a.R=10; //a.S=100; //ошибка - свойство доступно только для чтения Console.WriteLine("центр=({0},{1}) радиус={2} периметр={3:f2} площадь={4:f2}", a.X, a.Y, a.R, a.P, a.S); } }

Пример 13.1.

"Один класс - один файл",

С добавлением новых классов в программу резко увеличивается ее размер, что затрудняет ее прочтение. Поэтому следует руководствоваться одним простым принципом "один класс - один файл". Для того чтобы создать новый файл для класса Circle выполним следующие действия:

  1. В окне Solution Explorer щелкните правой кнопкой на имени проекта Hello (на рисунке выделен жирным).

  1. Выполните команду Add/Add Class…

В поле Name напишите Сircle.cs и нажмите кнопку Add.

Теперь окно Solution Explorer выглядит следующим образом:

А файл Circle.cs выглядит следующим образом:

using System; namespace ConsoleApplication1{ public class Circle { public Circle() { // // TODO: Add constructor logic here // } }}
  1. Замените namespace ConsoleApplication1 на namespace MyProgram, для того чтобы идентификаторы файлов Program.cs и Circle.cs были определены в одном пространстве имен.
  2. Перенесите класс Circle из файла Program.cs в файл Circle.cs.
  3. Теперь запустите программу и посмотрите, что она делает.

Практикум

  1. Создать класс Point, разработав следующие элементы класса:
    • Поля:
      • int x, y;
    • Конструкторы, позволяющие создать экземпляр класса:
      • с нулевыми координатами;
      • с заданными координатами.
    • Методы, позволяющие:
      • вывести координаты точки на экран;
      • рассчитать расстояние от начала координат до точки;
      • переместить точку на плоскости на вектор (a, b).
    • Свойства:
      • получить-установить координаты точки (доступное для чтений и записи);
      • позволяющие умножить координаты точки на скаляр (доступное только для записи).
  2. Создать класс Triangle, разработав следующие элементы класса:
    • Поля:
      • int a, b, c;
    • Конструктор, позволяющий создать экземпляр класса с заданными длинами сторон.
    • Методы, позволяющие:
      • вывести длины сторон треугольника на экран;
      • расчитать периметр треугольника;
      • расчитать площадь треугольника.
    • Свойства:
      • позволяющее получить-установить длины сторон треугольника (доступное для чтения и записи);
      • позволяющее установить, существует ли треугольник с данными длинами сторон (доступное только для чтения).
  3. Создать класс Rectangle, разработав следующие элементы класса:
    • Поля:
      • int a, b;
    • Конструктор, позволяющий создать экземпляр класса с заданными длинами сторон.
    • Методы, позволяющие:
      • вывести длины сторон прямоугольника на экран;
      • расчитать периметр прямоугольника;
      • расчитать площадь прямоугольника.
    • Свойства:
      • получить-установить длины сторон прямоугольника (доступное для чтения и записи);
      • позволяющее установить, является ли данный прямоугольник квадратом (доступное только для чтения).
  4. Создать класс Money, разработав следующие элементы класса:
    • Поля:
      • int first;//номинал купюры
      • int second; //количество купюр
    • Конструктор, позволяющий создать экземпляр класса с заданными значениям полей.
    • Методы, позволяющие:
      • вывести номинал и количество купюр;
      • определить, хватит ли денежных средств на покупку товара на сумму N рублей.
      • определить, сколько шт товара стоимости n рублей можно купить на имеющиеся денежные средства.
    • Свойства:
      • позволяющее получить-установить значение полей (доступное для чтения и записи);
      • позволяющее расчитатать сумму денег (доступное только для чтения).
  5. Создать класс для работы с одномерным массивом целых чисел. Разработать следующие элементы класса:
    • Поля:
      • int [] IntArray;
      • int n.
    • Конструктор, позволяющий создать массив размерности n.
    • Методы, позволяющие:
      • ввести элементы массива с клавиатуры;
      • вывести элементы массива на экран;
      • отсортировать элементы массива в порядке возрастания.
    • Свойства:
      • возвращающее размерность массива (доступное только для чтения);
      • позволяющее домножить все элементы массива на скаляр (доступное только для записи).
  6. Создать класс для работы с двумерным массивом целых чисел. Разработать следующие элементы класса:
    • Поля:
      • int [,] IntArray;
      • int n.
    • Конструктор, позволяющий создать массив размерности n×n.
    • Методы, позволяющие:
      • ввести элементы массива с клавиатуры;
      • вывести элементы массива на экран;
      • вычислить сумму элеметов i-того столбца.
    • Свойства:
      • позволяющее вычислить количество нулевых элементов в массиве (доступное только для чтения);
      • позволяющее установить значение всех элементы главной диагонали массива равное скаляру (доступное только для записи).
  7. Создать класс для работы с двумерным массивом вещественных чисел. Разработать следующие элементы класса:
    • Поля:
      • double [][] DoubelArray;
      • int n, m.
    • Конструктор, позволяющий создать массив размерности n×m.
    • Методы, позволяющие:
      • ввести элементы массива с клавиатуры;
      • вывести элементы массива на экран;
      • отсортировать элементы каждой строки массива в порядке убывания.
    • Свойства:
      • возвращающее общее количество элементов в массиве (доступное только для чтения);
      • позволяющее увеличить значение всех элементов массива на скаляр (доступное только для записи).
  8. Создать класс для работы сo строками. Разработать следующие элементы класса:
    • Поля:
      • StringBuilder Line;
      • int n.
    • Конструктор, позволяющий создать строку из n символов.
    • Методы, позволяющие:
      • подсчитать количество пробелов в строке;
      • заменить в строке все прописные символы на строчные;
      • удалить из строки все знаки препинания.
    • Свойства:
      • возвращающее общее количество элементов в строке (доступное только для чтения);
      • позволяющее установить значение поля, в соответствии с введенным значением строки с клавиатуры, а также получить значение данного поля (доступно для чтения и записи)
  9. Создать класс для работы с регулярными выражениями. Разработать следующие элементы класса:
    • Поля:
      • Regex r;
      • string text;
    • Методы, позволяющие:
      • определить, содержит ли текст фрагменты, соответствующие шаблону поля;
      • вывести на экран все фрагменты текста, соответствующие шаблону поля;
      • удалить из текста все фрагменты, соответствующие шаблону поля;
    • Свойства:
      • позволяющее установить или получить строковое поле класса (доступно для чтения и записи)
      • позволяющее установить или получить регулярное выражение, хранящееся в соответствующем поле класса (доступно для чтения и записи)
  10. Создать класс для работы с датой. Разработать следующие элементы класса:
    • Поле DataTime data.
    • Конструкторы, позволяющие установить:
      • заданную дату
      • дату 1.01.2009
    • Методы, позволяющие:
      • вычислить дату предыдущего дня;
      • вычислить дату следующего дня;
      • определить сколько дней осталось до конца месяца.
    • Свойства:
      • позволяющее установить или получить значение поле класса (доступно для чтения и записи)
      • позволяющее определить год высокосным (доступно только для чтения)







Дата добавления: 2017-03-29; просмотров: 617;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.005 сек.