Главная > Powershell > Классы в Powershell. Перегрузки

Классы в Powershell. Перегрузки

Продолжаем изучать классы в Powershell. Сегодня поговорим о перегрузках.

“Перегрузка” звучит как-будто произошло что-то страшное, или по крайней мере нехорошее. Но на самом деле это не так, всё очень даже хорошо Smile.

В интернетах нашёл такое определение:

Перегрузка методов – это объявление в классе методов с одинаковыми именами при этом с различными параметрами. Имея некий метод, чтобы его перегрузить, другой метод с таким же именем должен отличаться от него количеством параметров и/или типами параметров.

Другими словами, перегрузка метода – это возможность вызвать метод с различным набором параметров, и делать он будет плюс/минус одно и тоже. Это, в свою очередь, значит, что в коде нужно предусмотреть несколько вариантов описания метода.

Попробуем применить перегрузку к одному методу из нашего класса.

Напомню, что у нашего класса есть несколько свойств и методов (перечисления отброшу для простоты).

Class Robot
{
    # Свойства
    [string]$Name
    [int]$Id
    
    # Дата создания объекта (для каждого своя)
    [DateTime]$Birthday = (Get-Date)
    
    # Скрытое свойство
    hidden [int]$StepCount
    
    # Статическое свойство
    # Дата создания класса (у всех экземпляров этого класса одинаковая)
    static [DateTime]$Inception = (Get-Date)
    
    # Метод, вызывающий улыбку
    Smile()
    {
        Write-Host ':)'
    }

    # Метод - шаг
    Go([int]$Step) 
    { 
        Write-Host ('-'*$Step)
        $this.StepCount += $Step 
    }
}

При вызове метода Go() робот делает заданное в скобках количество шагов (по факту рисует знак “–”):

PS C:\> $Verter = [Robot]::new()

PS C:\> $Verter.Go(5)
-----

Допустим, мы хотим, чтобы наш робот имел возможность ходить быстрее за счёт увеличения размера шага (добавим пробел между “–”), при чём так, чтобы величину шага можно было задавать разную.

Для этого добавляем ещё один метод с тем же названием Go(), добавляем в него параметр, отвечающий за размер шага, и исправляем сам метод:

# Метод - большой шаг
Go([int]$Step, $StepSize)
{ 
    Write-Host (('-' + ' ' * $StepSize) *$Step)
    $this.StepCount += $Step 
}

В итоге весь класс будет выглядеть так:

Class Robot
{
    # Свойства
    [string]$Name
    [int]$Id
    
    # Дата создания объекта (для каждого своя)
    [DateTime]$Birthday = (Get-Date)
    
    # Скрытое свойство
    hidden [int]$StepCount
    
    # Статическое свойство
    # Дата создания класса (у всех экземпляров этого класса одинаковая)
    static [DateTime]$Inception = (Get-Date)    

    # Метод, вызывающий улыбку
    Smile()
    {
        Write-Host ':)'
    }

    # Метод - шаг
    Go([int]$Step) 
    { 
        Write-Host ('-'*$Step)
        $this.StepCount += $Step 
    }

    # Метод - большой шаг
    Go([int]$Step, $StepSize)
    { 
        Write-Host (('-' + ' ' * $StepSize) *$Step)
        $this.StepCount += $Step 
    }
}

Таким образом мы перегрузили метод Go(), т.е. в зависимости от того, с каким набором параметров будет вызван метод, будет вызвана та, или иная его реализация, и, следовательно, наш робот будет по разному “ходить”:

PS C:\> $Verter = [Robot]::new()

PS C:\> $Verter.Go(5)
-----

PS C:\> $Verter.Go(5, 2)
-  -  -  -  -  

PS C:\> $Verter.Go(5, 3)
-   -   -   -   -   

PS C:\> $Verter.Go(2, 5)
-     -  

Чтобы не раздувать статью до непомерных размеров на сегодня всё. В следующей статье продолжим развивать эту тему.

Реклама
Рубрики:Powershell Метки: ,
  1. 15/07/2017 в 11:58

    Полезная ссылка, если вставляете кусок кода:
    https://ru.support.wordpress.com/code/posting-source-code/

    Жаль что я много времени потратил на поиск этого решения и никто мне не подсказал 🙂

    • 17/07/2017 в 10:09

      Круто! Спасибо, не знал 🙂 Как-нибудь попробую.

  1. No trackbacks yet.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: