Главная > Powershell > Классы в Powershell. Добавление перечисления к классу

Классы в Powershell. Добавление перечисления к классу

В предыдущей статье мы рассмотрели, что такое перечисления, и как их создавать. Сегодня попробуем добавить перечисление к нашему собственному классу.

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

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 
    }
}

В предыдущей статье мы решили добавить красок к нашим серым будням возможность выбора цвета для будущих роботов с помощью перечисления. Для этого было создано перечисление, содержащее допустимые значения:

Enum ColorOfRobot
{
    Blue
    Green
    Red
}

Перечисления нельзя создавать в классе, поэтому нужно создать перечисление за пределами класса, и обратиться к нему из класса.

Перечисление у нас уже есть. Для того, чтобы добавить его к классу, нужно добавить в описание класса соответствующе свойство (в нашем случае цвет) соответствующего типа (определённое ранее перечисление):

Class Robot
{
    # Свойства
    <...>
    
    # Методы
    <...>
    
    # Перечисление
    [ColorOfRobot]$Color
}

Т.е. для пользователя класса Robot Color – это обычное свойство типа ColorOfRobot, которое содержит возможные цвета. Но мы как создатели класса знаем, что в свою очередь, ColorOfRobot это на самом деле – перечисление.

Теперь можно раскрашивать роботов в разные цвета, обращаясь к свойству Color как к обычному свойству:

$Walle = New-Object Robot
$Walle.Color = 'Blue'

$Eva = New-Object Robot
$Eva.Color = 'Red'

PS C:\> $Walle.Color
Blue

PS C:\> $Eva.Color
Red

В отличии от обычных свойств, свойства, заданные с помощью перечисления могут принимать только заданные в описании перечисления значения.

По ходу, когда создавали нас – человеков этот момент упустили Winking smile:

Enum GenderOfPerson
{
    Male
    Female
}

Class Person
{
    [string]$Name
    [GenderOfPerson]$Gender
}

PS C:\> $Konchita = New-Object Person
PS C:\> $Konchita.Name = 'Konchita'
PS C:\> $Konchita.Gender = 'other'

Исключение при задании "Gender" :
"Не удается преобразовать значение "other" в тип "GenderOfPerson".
Ошибка: "Не удается сопоставить пустое имя идентификатора
с допустимым именем перечислителя.
Укажите одно из следующих имен перечислителя и попробуйте еще раз:
Male, Female""

Также, нужно отметить, что если мы добавили к классу перечисление, но экземпляру класса не задали значение из этого перечисления, то по умолчанию, устанавливается первое значение, указанное в перечислении:

PS C:\> $Verter = New-Object Robot
PS C:\> $Verter.Color
Blue

Исследуя эти особенности и родился лайфхак как сделать свойство, доступное, только для чтения.

Для примера добавим к нашему классу свойство, описывающее материал, из которого мы планируем делать роботов:

Enum MaterialOfRobot
{
    Steel
}

Добавляем это свойство к классу. Пожалуй, даже правильней будет сделать это свойство статическим:

Class Robot
{
    # Свойства
    <...>

    # Методы
    <...>
    
    # Перечисление - цвет
    [ColorOfRobot]$Color
    
    # Перечисление - Read-only свойство
    static [MaterialOfRobot]$Material
}

Теперь, все создаваемые роботы будут с железными… из стали:

PS C:\> $Verter = New-Object Robot

PS C:\> $Verter::material
Steel

И так как мы сделали свойство статическим, то чтобы убедиться в этом даже необязательно создавать экземпляр класса:

PS C:\> [Robot]::Material
Steel

 

Напоследок, как выглядит наш класс на данном этапе:

# Перечисление - цвет
Enum ColorOfRobot
{
    Blue
    Green
    Red
}

# Перечисление - материал
Enum MaterialOfRobot
{
    Steel
}

# Класс
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 
    }

    # Добавляем перечисления: цвет и материал
    [ColorOfRobot]$Color
    static [MaterialOfRobot]$Material
}
Реклама
Рубрики:Powershell Метки: ,
  1. Комментариев нет.
  1. No trackbacks yet.

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

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

Логотип WordPress.com

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

Фотография Twitter

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

Фотография Facebook

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

Google+ photo

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

Connecting to %s

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