Перегрузка членов класса
Метод RaiseSalary класса Employee можно сделать и поинтереснее. Предположим, повышения зарплаты до 10% происходят автоматически, но для больших сумм требуется специальный пароль. В прежних версиях VB такие задачи решались при помощи необязательных параметров. Хотя эта возможность сохранилась и в VB .NET, существует более изящное решение с определением двух версий RaiseSalary. Используя возможность перегрузки методов, мы определяем два разных метода для разных случаев.
В VB .NET синтаксис перегрузки методов очень прост: для этого в программе просто определяются два метода с одинаковыми именами и разными параметрами. Тем не менее мы настоятельно рекомендуем использовать ключевое слово Over! oads. По нему пользователи вашего кода узнают о том, что метод перегружается намеренно, а не в результате ошибки. В следующем фрагменте приведены две версии метода RaiseSalary, о которых говорилось выше:
Public Overloads Sub RaiseSalary(ByVal Percent As Decimal)
If Percent > 0.1 Then
' Операция запрещена - необходим пароль
Console.WhteLineC'MUST HAVE PASSWORD TO RAISE SALARY " & _
"MORE THAN 10*!!!!") Else X
m_Salary =(1 + Percent) * m_salary End If End Sub
Public Overloads
Sub RaiseSalary(ByVal Percent As Decimal._
ByVal Password As Stqng)
If Password -"special Then
m_Salary = (1 + Percent) * m_Salary
End If End Sub
При перегрузке методы класса различаются только по типам параметров. Методы не могут перегружаться по типу возвращаемого значения или уровню доступа.
Ниже приведен пример класса Empl oyee с перегруженным методом Rai seSalany, а также небольшая тестовая программа. Обратите внимание: 10%-ный порог не кодируется в программе, а определяется в виде константы:
Option Strict On Module Modulel Sub Main()
Dim Tom As New Employee("Tom". 100000)
Console.WhteLineCTom.TheName & " has salary " & Tom.Salary)
Tom.RaiseSalary(0.2D)
' Суффикс D - признак типа Decimal
Console.WriteLine(Tom.TheName & " still has salary " & Tom.Salary)
Console. WhteLine()
Dim Sally As New Employee("Sally", 150000)
Console.WriteLine(Sally.TheName & " has salary " & Sally.Salary)
Sally.RaiseSalary(0.2D,"special")
' Суффикс D - признак типа Decimal
Console.WriteLine(Sally.TheName & "has salary "SSally.Salary)
Console. WriteLine()
Console.WriteLine("Please press the Enter key")
Console. ReadLine()
End Sub
End Module
Public Class Employee
Private m_Name As String
Private m_Salary As Decimal
Private Const LIMIT As Decimal = 0.1D
Public Sub New(ByVal theName As String,ByVal curSalary As Decimal)
m_Name = thename
m_Salary = curSalary
End Sub
Readonly Property TheName()As String Get
Return m_Name
End Get '
End Property
Readonly Property Salary()As Decimal Get
Return m_Salary
End Get
End Property
Public Overloads
Sub RaiseSalary(ByVal Percent As Decimal)
If Percent > LIMIT Then
' Операция запрещена - необходим пароль
Console.WriteLine("MUST HAVE PASSWORD TO RAISE SALARY " & _
"MORE THAN LIMIT!!!!")
Else
m_Salary =(1 +Percent)*m_salary End If End Sub
Public Overloads
Sub RaiseSalary(ByVal Percent As Decimal._
ByVal Password As String)
If Password = "special" Then
m_Salary =(1 + Percent) * m_Salary
End If
End Sub
End Class