- •Классы. Создание экземпляров класса. Особенности перегрузки конструкторов
- •Классы: особенности инициализации полей, поля const и readonly
- •Статические элементы класса. Статический конструктор.
- •Индексаторы
- •Механизмы наследования. Объявление наследования.
- •Конструкторы производных и базовых классов. Использование ключевого слова base.
- •Скрытие наследуемых элементов.
- •Переопределение наследуемых элементов.
- •Полиморфное поведение производных классов.
- •Абстрактные методы и классы.
- •Интерфейсы. Операции is и as.
- •Разработка и использование интерфейсов.
- •Делегаты.
- •События. Правила использования стандартных делегатов.
Классы. Создание экземпляров класса. Особенности перегрузки конструкторов
Представьте себе, что у вас есть некоторый объект, который характеризуется рядом свойств. Например, работник на некой фирме. У него есть такие свойства, как фамилия, возраст, стаж и т. п. Так вот, в этом случае удобно каждого работника описывать не рядом независимых переменных (строкового типа для фамилии, целого типа для возраста и стажа), а одной переменной типа Worker, внутри которой и содержаться переменные для фамилии, возраста и стажа. Это здесь самое важное - что в переменной типа Worker содержаться другие переменные. Конечно, типа Worker среди встроенных типов данных нет - ну так эта не беда - мы можем ввести его. Это и есть класс.
Главное их отличие от структур состоит в том, что классы
поддерживают отношения наследования между собой. Разновидностью класса являются интерфейсы и делегаты. Первые позволяют реализовать множественное наследование поведения (функциональности), а на основе делегатов программируется реакция систем на внешние (управленческие) воздействия).
Пример объявления класса: class A{};
Операция new выделяет память и вызывает конструктор «по
умолчанию». Как известно, объекты «классных» типов – ссылочные и сами по себе содержат только ссылку.
Конструктор класса «по умолчанию» выполняет инициализацию полей объекта значениями по умолчанию (для числовых – нуль, для ссылочных – нуль-адрес или null).
Пример создания экземпляра класса: A obj = newA();
Конструктор класса «по умолчанию» можно перегрузить и, более того, при определении в классе хотя бы одного явного конструктора, конструктор «по умолчанию» отключается! Класс может иметь неограниченное количество перегруженных конструкторов.
При перегрузке мы имеем в одной области видимости два или более одноименных метода. Для того, чтобы при компиляции не было ошибок, эти методы должны различаться или типом параметров, или их количеством (или и тем и другим).
using System;
namespace test
{ class SomeClass{
//Первый метод SomeFunc.
public static int SomeFunc()
{ return 0; }
//Второй метод SomeFunc.
public static int SomeFunc(int k)
{ return k*k;}
//Третий метод SomeFunc.
public static float SomeFunc(float k)
{ return k; } }
class Test {static void Main()
{Console.WriteLine(SomeClass.SomeFunc());
Console.WriteLine(SomeClass.SomeFunc(10));
Console.WriteLine(SomeClass.SomeFunc((float)10)); } } }
На экране: 0 100 10.
Классы: особенности инициализации полей, поля const и readonly
Основной элемент класса – это поля. В отличие от структур поля класса могут быть проинициализ. сразу, при объявлении (это выполняется до вызова конструк.):
class A
{int a=1;double b=2;string s="Три";}
Поля класса могут иметь модификаторы const (значения должны быть определены при инициализации, Модификатор const используется для объявления полей или локальных переменных, которые не должны изменяться; Этим переменным необходимо присвоить начальные значения при объявлении. Таким образом, const-переменная является, по сути, константой. ) и readonly. В данном случае значения не обязательно задавать при объявлении, но они должны быть непременно определены в конструкторе, так как сразу после создания экземпляра вступает в действие режим readonly (после этого изменить его содержимое уже нельзя).
namespace Class3
{class A
{const int a=1;
readonly double b;
public A( double с)
{ b = с+a;}
public override string ToString()
{ return String.Format("a={0} b= {1}",a,b); } }
class Program {static void Main()
{ A a = new A(2.5); Console.WriteLine(a.ToString()); } } }
На экране: a=1 b= 3.5