Иногда возникает потребность создать один и тот же метод, но с разным набором параметров. И в зависимости от имеющихся параметров и использовать определенную версию метода. Допустим, в нашем классе State мы хотим определить метод для нападения на другое государство - метод Attack. Первая реализация метода будет принимать в качестве параметра объект State - то есть государство, на которое мы нападаем:
Public Sub Attack(enemy As State) End Sub
Но предположим, что мы хотим определить версию данного метода, где мы будем указывать не только государство, но количество войск, с помощью которых мы нападаем на врага. Тогда мы можем просто добавить вторую версию данного метода:
Public Class State
Public Sub Attack(enemy As State)
'Здесь код метода
End Sub
Public Sub Attack(enemy As State, army As Integer)
'Здесь код метода
End Sub
End Class
Либо в определении каждой версии метода мы можем использовать ключевое слово Overloads (тогда все версии этого метода должны быть помечены этим словом):
Public Class State
Public Overloads Sub Attack(enemy As State)
'Здесь код метода
End Sub
Public Overloads Sub Attack(enemy As State, army As Integer)
'Здесь код метода
End Sub
End Class
Кроме методов мы можем также перегружать операторы. Поскольку перегружаемый оператор будет использоваться для всех объектов данного класса, то он объявляется с модификаторами Public Shared, после которых указывается ключевое слово Operator и далее знак оператора:
Public Shared Operator +(a As Object, b As Object) As Object End Operator
Посмотрим на примере. У нас есть класс State или государство. Определим для этого класса оператор "+", который будет обозначать объединение двух государств, кроме того, предусмотрим операторы сравнения - ">" и "<", с помощью которых мы будем сравнивать два государства:
Public Class State
Private name_ As String = ""
Public Property President() As String
Public Property Area() As Double
Public Property Population() As Integer
Public Property Name As String
Get
Return name_
End Get
Set(value As String)
name_ = value
End Set
End Property
Public Shared Operator +(a As State, b As State) As State
Dim c As State = New State()
'Площадь нового государства
c.Area = a.Area + b.Area
'Население нового государства
c.Population = a.Population + b.Population
c.President = a.President
c.Name = a.Name
Return c
End Operator
Public Shared Operator >(a As State, b As State) As Boolean
If a.Area > b.Area Then
Return True
Else
Return False
End If
End Operator
Public Shared Operator <(a As State, b As State) As Boolean
If a.Area < b.Area Then
Return True
Else
Return False
End If
End Operator
End Class
Обратите внимание, что поскольку мы применяем операцию сложения и сравнения над двумя объектами State, то мы должны передать эти объекты в качестве параметров. Тогда мы можем использовать операторы следующим образом:
Sub Main()
Dim s1 As State = New State()
s1.Name = "State1"
s1.Area = 1000
s1.President = "John"
s1.Population = 1000
Dim s2 As State = New State()
s2.Name = "State2"
s2.Area = 300
s2.President = "Dick"
s2.Population = 100
If s1 > s2 Then
Console.WriteLine("Государство {0} больше государства {1}", s1, s2)
Else
Console.WriteLine("Государство {0} меньше государства {1}", s1, s2)
End If
Dim s3 As State = s1 + s2
Console.WriteLine("Название государства : {0}", s3.Name)
Console.WriteLine("Президент государства : {0}", s3.President)
Console.WriteLine("Площадь государства : {0}", s3.Area)
Console.WriteLine("Население государства : {0}", s3.Population)
Console.ReadLine()
End Sub