Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

C# / Класс

.doc
Скачиваний:
17
Добавлен:
03.06.2015
Размер:
65.02 Кб
Скачать

Класс - это некоторая абстракция, структура, позволяющая пользователю создавать собственные типы с определенной схемой построения и набором полей, свойств, методов. Сначала рассмотрим общую структуру построения класса в языке C#.

[атрибуты] [модификаторы] class Имя_класса : [родитель] { [атрибуты] [модификаторы] тип имя_поля [= значение]; [атрибуты] [модификаторы] тип Имя_свойства { [модификаторы] get {тело_метода}; [модификаторы] set {тело_метода}; } [атрибуты] [модификаторы] тип Имя_метода ([параметры]) { тело_метода; } }

В квадратных скобках указаны необязательные элементы. Покажем на примере класса Money:

public class Money     {         private int nominal;         private int quantity;         public int Nominal         {             get { return nominal; }             set { nominal = value; }         }         public int Quantity         {             get { return quantity; }             set { quantity = value; }         }         public Money(int x, int y)         {             this.nominal = x;             this.quantity = y;         }         public int Sum()         {             return (nominal * quantity);         }     }

Возможно использование следующих модификаторов:

Модификатор

Поле

Метод

Класс

private

+

+

+

protected

+

+

-

internal

+

+

+

protected internal

+

+

-

public

+

+

+

static

+

+

+

sealed

-

+

+

abstract

-

+

+

virtual

-

+

-

override

-

+

-

new

-

+

-

Модификатором по умолчанию для класса является internal, метода и поля - private. Рассмотрим значение нескольких модификаторов таким образом: сначала для класса, затем для полей и методов.

  • Private Доступ только из элементов класса, внутри которых описан данный класс. Используется для вложенных классов. Поля и методы доступны только из данного класса.

  • Protected Поля и методы доступны только из данного класса и его потомков.

  • Internal Доступ только из данного проекта (сборки). Аналогично.

  • Protected Internal Методы доступны из данного проекта (сборки) или в потомках.

  • Public Доступ не ограничен. Аналогично.

Стоит заметить, что поля настоятельно рекомендуется делать private, а доступ осуществлять к ним через свойства.

Продолжаем более подробно рассматривать ООП в языке C#. Начнем с полей и свойств, так как это 2 взаимосвязанных понятия. Поле - переменная класса или структуры, хранящая значение. Свойство - это метод или пара методов, предназначенных для чтения и корректной записи в поле, то есть оно служит для инкапсуляции (закрытия) поля. Составляющими свойства являются - getter и setter. Cвойство в С# 3.0 можно записать следующим образом:

1

public DateTime BirthDate {get; set;}

Это будет соответствовать записи:

1 2 3 4 5 6

private DateTime birthDate; public DateTime BirthDate { get { return birthDate;} set { birthDate = value;} }

Заметим, что getter и setter также могут иметь собственные спецификаторы доступа. Далее рассмотрим методы, которые делятся на:

  • Конструкторы

  • Деструкторы

  • Статические методы

  • Операторы

В любом классе существует конструктор "по умолчанию". Он вызывается при создании экземпляра класса, например:

1

Circle c = new Circle();

, если конструктор не задан явно:

1 2 3 4 5 6

public Circle() { this.x = 0; this.y = 0; this.r = 1; }

Класс или структура могут иметь несколько конструкторов, принимающие на вход различные параметры. Конструктор с параметрами задается следующим образом (в данном случае ключевое слово this используется для различия элементов с одинаковыми именами):

1 2 3 4 5 6

public Circle(double x, double y, double r) {    this.x = x;    this.y = y;    this.r = r; }

В языке C# также есть деструкторы:

1 2 3 4 5 6

public MyClass {    ~MyClass()    {    } }

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

1 2 3 4 5 6 7 8 9 10 11

public class MyClass {    public static int x;    public static int Func()    {       return x * x;    } } ... MyClass.x = 2; Console.WriteLine(MyClass.Func());

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

Рассмотрим основные принципы наследование классов в C#. Вспомним из предыдущей статьи синтаксис класса:

1 2 3 4

[атрибуты] [модификаторы] class Имя_класса : [родитель] { }

Под родителем понимается класс, от которого наследуется данный. Существует несколько понятий, имеющих одно и то же значение, обозначающие наследуемый класс - базовый класс (base class) , родительский класс (parent class), предок. Класс, который наследует, называется производным, потомком или наследником. Потомок наследует все поля, свойства, методы, индексаторы, операторы от предка, помеченные соответствующим модификатором доступа. Кроме этого он может иметь собственные элементы или переопределить существующие. Наследование можно рассмотреть на примере класса Point2D и класса Point3D, который от него наследуется.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

    class Point2D     {         protected double x; // поле доступно только в производных классах         protected double y; // поле доступно только в производных классах         public Point2D(double x, double y)         {             this.x = x;             this.y = y;         }         protected Point2D()             :this(0,0)         { }     }     class Point3D : Point2D     {         private double z;         Point3D(double x, double y, double z)             :base(x,y)         {             this.z = z;         }     }

В данном случае класс Point3D наследует переменные x, y, а также конструктор базового класса. Параметр base действует аналогично this, только используется он всегда для доступа к членам класса-предка, в то время как this - ссылается на текущий экземпляр класса. В этом случае часть объекта, соответствующая базовому классу, создается через вызов его конструктора. А часть, соответствующая производному, - с помощью конструктора потомка. Через параметр base можно вызвать любой конструктор базового класса с соответствующими параметрами. Добавим по методу GetRadius() в оба класса:

1 2 3 4 5 6 7 8 9 10

        // в Point2D         public double GetRadius()         {             return Math.Sqrt(x * x + y * y);         }         // в Point3D         public new double GetRadius()         {             return Math.Sqrt(x * x + y * y + z * z);         }

Это называется перекрытием метода, а точнее скрытием. В данном случае модификатор new явно скрывает базовый метод GetRadius() и заменяет его методом в производном классе. Класс, помеченный модификатором sealed не может быть унаследован.

Соседние файлы в папке C#