Иногда возникает потребность создать один и тот же метод, но с разным набором параметров. И в зависимости от имеющихся параметров и использовать определенную версию метода. Допустим, в нашем классе 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