double arrow

Class Classl. Одной из способностей структур, является способность содержать не только данные, но и функции

Перегрузка функций

Struct customerName

Struct customerName

Функции структур

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

В качестве простого примера рассмотрим следующую структуру:

{

public string firstName, lastName;

}

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

CustomerName myCastomer;

myCustomer.firstName= “John”;

myCustomer.lastName =”Franklin";

Console.WriteLine(“{0} {1}”, customer.firstName, customer.lastName);

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

{

public string firstName, lastName;

public string Name ()

{

return firstName + “ “ + lastName;

}

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

customerName myCustomer;

myCustomer.firstName = "John";

myCustomer.lastName = “Franklin";

Consо1e.WriteLine(customer.Name());

Этот синтаксис гораздо проще и понятнее, чем предшествующий. Необходимо отметить, что функция Name() имеет непосредственный доступ к полям структуры firstName и lastName. В рамках структуры customerName они могут считаться глобальными.




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

Например, ранее мы использовали следующую программу, в которой содержалась функция с именем MaxValue ().

{

static int MaxValue(int[] intArray)

{

int maxVal = intArray[0];

for (int i = 1; i < intArray.Length; i++)

{

if (intArray[i] > maxVal)

maxVal = intArray[i];

}

return maxVal;

}

static void Main (string [] args)

{

int[] myArray = {1, 8, 3, 6, 2, 5, 9, 3, 0, 2};



int maxVal = MaxValue (myArray) ;

Console.WriteLine(“The maximum value in myArray is {0}”, maxVal);

}

}

Эта функция может использоваться только для массивов значений типа int. Мы могли бы создать функции с другими именами, предназначенные для работы с параметрами других типов, переименовав вышеприведенную функцию как-нибудь вроде IntArrayMaxValue () И добавив функции наподобие DoubleArrayMaxValue () для работы с другими типами. В качестве альтернативы мы можем просто включить в нашу программу следующую функцию:

static double MaxValue (double [.] doubleArray)

{

double maxVal = doubleArray [0];

for (int i = 1; i < doubleArray.Length; i++)

{

if (doubleArray[i] > maxVal)

maxVal = doubleArray[i];

}

return max Val ;

}






Сейчас читают про: