Перегрузка функций
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;
}