Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Подробнее о методах и классах.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
144.16 Кб
Скачать

8.5 Возврат объектов из методов

Метод может возвратить данные любого типа, в том числе и тип класса. Ниже в ка­честве примера приведен вариант класса Rect, содержащий метод Enlarge(), в ко­тором строится прямоугольник с теми же сторонами, что и у вызывающего объекта прямоугольника, но пропорционально увеличенными на указанный коэффициент.

Листинг 8.14

// Возврат объекта из метода.

using System;

class Rect

{

int width;

int height;

public Rect(int w, int h)

{

width = w;

height = h;

}

public int Area()

{

return width * height;

}

public void Show()

{

Console.WriteLine(width + " " + height);

}

/* Метод возвращает прямоугольник со сторонами, пропорционально

увеличенными на указанный коэффициент по сравнению с

вызывающим объектом прямоугольника. */

public Rect Enlarge(int factor)

{

return new Rect(width * factor, height * factor);

}

}

class RetObj

{

static void Main()

{

Rect r1 = new Rect(4, 5);

Console.Write("Размеры прямоугольника r1: ");

r1.Show();

Console.WriteLine("Площадь прямоугольника r1: " + r1.Area());

Console.WriteLine();

// Создать прямоугольник в два раза больше прямоугольника r1.

Rect r2 = r1.Enlarge(2);

Console.Write("Размеры прямоугольника r2: ");

r2.Show();

Console.WriteLine("Площадь прямоугольника r2 " + r2.Area());

}

}

Выполнение этой программы дает следующий результат.

Размеры прямоугольника rl: 4 5

Площадь прямоугольника rl: 20

Размеры прямоугольника г2: 8 10

Площадь прямоугольника г2: 80

Когда метод возвращает объект, последний продолжает существовать до тех пор, пока не останется ссылок на него. После этого он подлежит сборке как "мусор". Сле­довательно, объект не уничтожается только потому, что завершается создавший его метод.

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

Листинг 8.15

// Использовать фабрику класса.

using System;

class MyClass

{

int a, b; // закрытые члены класса

// Создать фабрику для класса MyClass.

public MyClass Factory(int i, int j)

{

MyClass t = new MyClass();

t.a = i;

t.b = j;

return t; // возвратить объект

}

public void Show()

{

Console.WriteLine("a и b: " + a + " " + b);

}

}

class MakeObjects {

static void Main() {

MyClass ob = new MyClass();

int i, j;

// Сформировать объекты, используя фабрику классов.

for(i=0, j=10; i < 10; i++, j--) {

MyClass anotherOb = ob.Factory(i, j); // создать объект

anotherOb.Show();

}

Console.WriteLine();

}

}

Вот к какому результату приводит выполнение этого кода

a и b: 0 10

a и b: 1 9

a и b: 2 8

a и b: 3 7

a и b: 4 6

a и b: 5 5

a и b: 6 4

a и b: 7 3

a и b: 8 2

a и b: 9 1

Рассмотрим данный пример более подробно. В этом примере конструктор для класса МуСlass не определяется, и поэтому доступен только конструктор, вызывае­мый по умолчанию. Это означает, что значения переменных а и b нельзя задать с по­мощью конструктора. Но в фабрике класса Factory() можно создать объекты, в ко­торых задаются значения переменных а и b. Более того, переменные а и b являются закрытыми, и поэтому их значения могут быть заданы только с помощью фабрики класса Factory().

В методе Main() получается экземпляр объекта класса MyClass, а его фабричный метод используется в цикле for для создания десяти других объектов. Ниже приведе­на строка кода, в которой создаются эти объекты.

MyClass anotherOb = ob.Factory(i, j); // создать объект

На каждом шаге итерации цикла создается переменная ссылки на объект anotherOb, которой присваивается ссылка на объект, формируемый фабрикой клас­са. По завершении каждого шага итерации цикла переменная anotherOb выходит за пределы области своего действия, а объект, на который она ссылается, утилизируется.