Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП.doc
Скачиваний:
1
Добавлен:
24.09.2019
Размер:
522.24 Кб
Скачать

Вопрос 7) Реализация методов класса. Конструкторы и деструкторы. Методы и их параметры

Все активные действия программ на C# выполняются в методах классов. Естественно, эти методы могут получать на вход параметры и выдавать значения. При передаче параметров в C# необходимо явно указывать способ передачи - по значению или по ссылке; в последнем случае переменной должно предшествовать ключевое слово ref . Кроме того, создатели C# предусмотрели возможность для возвращения более чем одного значения из метода - для этого помимо явного возвращаемого значения метода, необходимо описать один или несколько параметров метода с ключевым словом out. Компилятор C# проверяет, что ref -параметры инициализируются перед вызовом метода, а также, что out-параметры получают значение до выхода из метода.

С точки зрения перегрузки методов, отличительной особенностью C# является то, что методы по умолчанию не являются виртуальными. Это сделано для того, чтобы избежать ошибок, связанных со случайным переопределением унаследованных функций. Кроме того, в C# есть два способа переопределения виртуального метода: при использовании ключевого слова override базовый метод становится недоступным, а при использовании ключевого слова new базовый метод все еще может быть вызван путем явного приведения к типу базового класса, как в следующем примере:

class BaseClass {

public void TestMethod() {

Console.WriteLine ("BaseClass.TestMethod()");

}

}

class DerivedClass : BaseClass {

new public void TestMethod() {

Console.WriteLine ("DerivedClass.TestMethod()");

}

}

...

DerivedClass test = new DerivedClass();

test.TestMethod(); // напечатает DerivedClass.TestMethod

((BaseClass)test).TestMethod(); // напечатает BaseClass.TestMethod

Конструкторы и деструкторы

class TestClass {

public TestClass() { … }

public ~TestClass () { ReleaseResources(); }

public ReleaseResources() {

// closing connections, releasing system resources etc.

}

Конструкторы/деструкторы не возвращают значений.

Для статических классов конструкторы могут быть закрытыми ( private ).

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

public Matrix() // implements default constructor

{

for (int i=0; i<n; i++)

for (int j=0; j<n; j++)

elements[i,j] = 0;

}

public Matrix (int val) // implements constructor with one parameter

{

for (int i=0; i<n; i++)

for (int j=0; j<n; j++)

elements[i,j] = val;

}

В C# нет деструкторов в привычном понимании этого слова, т.е. объекту не может быть приписан специальный метод, физически уничтожающих объект по явному запросу пользователя. Дело в том, что за освобождение памяти в .NET отвечает механизм сборки мусора и потому явное уничтожение объектов в C# не предусмотрено. Предусмотрены только так называемые завершители (finalizers), которые вызываются сборщиком мусора непосредственно перед уничтожением объекта. Но так как невозможно предсказать когда произойдет сборка мусора (и даже произойдет ли вообще), более надежным способом считается выделение завершающих действий в отдельный метод с именем Close или Dispose. Этот метод может вызывать как завершитель, так и сам пользователь.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]