
- •Программирование на языке Visual c#
- •14. Объектно-ориентированное программирование
- •14.1. Основные принципы ооп
- •14.2. Объекты
- •14.3. Классы
- •14.4. Определение классов и их членов
- •14.4.1. Определение полей
- •14.4.2. Определение свойств
- •14.4.3. Определение методов
- •14.4.4. Конструкторы
- •14.5. Статические классы и их члены
- •9.5. Члены классов
14.4.3. Определение методов
Метод определяет действие (процедуру), которое можно выполнить над объектом или классом. Каждый метод может иметь или не иметь тип возвращаемого значения. Если метод не имеет типа возвращаемого значения, то в его объявлении в качестве такого типа должно указываться ключевое слово void (т.е. метод не возвращает значения). Методы могут иметь или не иметь параметры.
Определение метода класса имеет следующий вид:
class SampleClass
{ public int sampleMethod(string sampleParam)
{ // Код тела метода
}
}
Различают статические и экземплярные методы [5]. Отличие между ними состоит в том, что статические методы имеют доступ только к статическим членам класса и не имеют доступа к полям и методам экземпляра, а метод экземпляра имеет доступ и к статическим полям класса, и к полям экземпляра объекта.
Статические методы вызываются из любого места класса, а не из его экземпляров. Такие методы объявляются с применением модификатора static, как показано в следующем примере:
using System;
public class A
{ public static void SomeFunction()
{ System.Console.WriteLine("Вызван метод SomeFunction()");
}
static void Main()
{ A.SomeFunction(); // Вывод: Вызван метод SomeFunction()
SomeFunction(); // Вывод: Вызван метод SomeFunction()
Console.ReadLine(); // Ожидание нажатия клавиши <Enter>
}
}
Обратите внимание, что оба метода в этом примере являются статическими. В методе Main сначала вызывается метод SomeFunction с указанием имени класса. После этого вызывается статический метод без указания имени класса. Причина в том, что методы Main и SomeFunction определены в одном и том же классе и оба являются статическими. Если бы метод SomeFunction относился к другому классу, например, В, то на этот метод пришлось бы ссылаться следующим образом: В.SomeFunction .
Методы экземпляра работают с объектами. Для того чтобы вызвать метод экземпляра, необходимо сослаться на экземпляр класса, определяющего этот метод. В следующем примере демонстрируется применение метода экземпляра:
using System;
using System;
public class A
{ private int x;
private int y;
private static int z;
private void SomeOperation()
{ x = 1;
this.y = 2;
z = 3;
// Присваивание this в объектах является ошибкой
// A newinstance = new A();
// this = newinstance;
}
static void Main()
{ A obj = new A();
obj.SomeOperation();
System.Console.WriteLine("x = {0}, y = {1}, z = {2}",
obj.x, obj.y, A.z);
// Вывод: x = 1, y = 2, z = 3
Console.ReadLine(); // Ожидание нажатия клавиши <Enter>
}
}
В методе Main создается новый экземпляр класса A и затем вызывается метод SomeOperation через экземпляр этого класса. Внутри тела метода SomeOperation имеется доступ к полям экземпляра и статическим полям класса, поэтому присваивать им значения можно просто с использованием их идентификаторов. Несмотря на то что, как уже упоминалось, в методе SomeOperation можно присваивать значение статическому члену z, не квалифицируя его, для достижения лучшей читабельности кода во время присваивания значений следует квалифицировать статические поля даже в методах, относящихся к тому же самому классу. Это поможет тем, кому придется сопровождать код.
Обратите внимание, что при присваивании значения поле у снабжается префиксом – идентификатором this. С помощью this можно обращаться к полям экземпляра, как было показано в предыдущем примере кода. Поскольку значение this доступно только для чтения, ему нельзя присвоить что-либо, что заставит его ссылаться на другой экземпляр. При попытке сделать это компилятор сообщит об ошибке, и код не скомпилируется.
Перегрузка метода.
Класс может иметь несколько реализаций или перегрузок одного и того же метода, которые отличаются от других числом или типами параметров. Например:
public int sampleMethod(string sampleParam)
{ // Код, использующий данные типа string
};
public int sampleMethod(int sampleParam)
{ // Код, использующий данные типа int
}
Как правило, метод объявляется при определении класса. Однако C# и Visual Basic также поддерживают методы расширения, которые позволяют добавлять методы в существующий класс вне определения класса.