Перегрузка методов и операторов

Последнее обновление: 30.10.2015

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