Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теоретический_курс.doc
Скачиваний:
36
Добавлен:
10.11.2019
Размер:
7.68 Mб
Скачать

3. Создание экземпляра класса

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

Объекты можно создавать с помощью ключевого слова new, за которым следует имя класса, на котором будет основан объект:

MyClass myClass1 = new MyClass();

При создании экземпляра класса, ссылка на этот объект передаётся программисту. В предыдущем примере myClass1 является ссылкой на объект, основанный на MyClass. Эта ссылка указывает на новый объект, но не содержит данные этого объекта. Фактически, можно создать ссылку на объект без создания самого объекта:

MyClass myClass1;

Создание таких ссылок, которые не указывают на объект, не рекомендуется, так как попытка доступа к объекту по такой ссылке приведет к выдаче ошибки (исключения) во время выполнения. Однако такую ссылку можно сделать указывающей на объект, создав новый объект или назначив её существующему объекту:

MyClass myClass1 = new MyClass();

MyClass myClass2 = myClass1;

В данном коде создаются две ссылки на объекты, которые указывают на один объект. Поэтому любые изменения объекта, выполненные посредством myClass1, будут видны при последующем использовании myClass2.Поскольку на объекты, основанные на классах, указывают ссылки, классы называют ссылочными типами.

4. Наследование классов

Наследование выполняется с помощью образования производных, то есть класс объявляется с помощью базового класса, от которого он наследует данные и поведение. Базовый класс задается добавлением после имени производного класса двоеточия и имени базового класса:

public class SecondMyClass : MyClass

{

//...

}

Когда класс объявляет базовый тип, он наследует все члены базового класса, за исключением конструкторов.

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

Класс может быть объявлен абстрактным (abstract). Абстрактный класс содержит абстрактные методы, которые имеют определение сигнатуры, но не имеют реализации. Создавать абстрактные классы нельзя. Они могут использоваться только посредством производных классов, реализующих абстрактные методы. И наоборот, запечатанный (sealed) класс не позволяет другим классам быть от него производными. Также класс можно разделить между файлами. Это разделяемый класс (partial).

Пример класса с переменной и методом, а также использование этого метода в консольном приложении:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace LC_Console

{

public class Person

{

// Переменная

public string name;

// Конструктор

public Person()

{

name = "Неизвестно";

}

// Метод

public void SetName(string newName)

{

name = newName;

}

}

class TestPerson

{

static void Main()

{

Person person = new Person();

Console.WriteLine(person.name);

person.SetName("John A.");

Console.WriteLine(person.name);

/*

* Выведет:

* Неизвестно

* John A.

*/

Console.WriteLine("Для продолжения нажмите любую клавишу . . . ");

Console.ReadKey();

}

}

}

В отличие от C++, в C# допускается только одиночное наследование. Другими словами, класс может наследовать реализацию только от одного базового класса. Однако класс может реализовать несколько интерфейсов. В приведённой ниже таблице приведены примеры наследования класса и реализации интерфейса:

Наследование

Пример

Нет

class ClassA { }

Single

class DerivedClass: BaseClass { }

Отсутствует, реализует два интерфейса

class ImplClass: IFace1, IFace2 { }

Одиночное, реализует один интерфейс

class ImplDerivedClass: BaseClass, IFace1 { }