можно ли создавать подклассы в powershell v5?

Я пытался найти решение сегодня днем, но пока у меня только частичный успех...

Вот мой код:

class Animal {
    [int] $numOfLegs = 0;
    [int] $numOfEyes = 2;

    [scriptblock] $dog = { 
        class Dog { 
            [int] $numOfLegs = 4
            [int] getLegs(){ return $this.numOfLegs; }
            [int] getEyes(){ return $numOfEyes; }
        }

        return [dog]::new()       
     }
}

(С помощью этого можно создать экземпляр класса Dog):

$mypetdog = & ([animal]::new().Dog)

По сути, моя идея заключалась в том, чтобы попытаться заставить блоки сценариев действовать как замыкания, чтобы можно было вызвать каждое определение «подкласса», содержащееся в Animal (и при этом иметь доступ к его родительской области). Так, например, когда getEyes() выполняется для объекта Dog, теоретически он вернет число 2. Однако это не сработало, потому что я думаю, что блок сценария не может видеть за пределами своей собственной области видимости (когда он определен в классе).

Итак, когда я делаю это:

$mypetdog.getLegs()

он правильно возвращает 4, но когда я это делаю:

$mypetdog.getEyes()

Powershell понятия не имеет, что такое переменная $numOfEyes, и впоследствии выдает ошибку, поскольку переменная не определена в классе.

У кого-нибудь есть решение для имитации подклассов в PowerShell без использования типа добавления?


person Steve Rathbone    schedule 01.02.2015    source источник
comment
Ваш вопрос касается унаследованного класса, а не подкласса; подкласс будет классом внутри другого класса, такого как class tree{class node{}}, где узел не является специализированным типом дерева, но этот конкретный тип узла сам по себе не имеет никакого значения, кроме как в контексте класса родительского дерева.   -  person Gregor y    schedule 09.05.2020


Ответы (2)


Классы в PowerShell 5.0 были созданы для упрощения разработки ресурсов DSC, не требующих наследования, поэтому пока не поддерживаются. Как вы можете видеть ниже, они будут работать над этим, но пока нет ETA, а это значит, что вам, возможно, придется подождать до версии 6+.

Сентябрьская предварительная версия была сосредоточена на возможности записи ресурса DSC через классы PowerShell. Это не требует наследования, так что вы правы, наследование не поддерживается в сентябрьской предварительной версии.

Классы по-прежнему полезны для многих вещей без наследования — например, C жив и здоров, и у него до сих пор нет функций-членов, не говоря уже о наследовании.

Тем не менее, мы, очевидно, понимаем важность наследования. Никаких обещаний относительно того, когда он будет доступен, но мы работаем над этим.

Источник: Блог WMF — Комментарии

Вы можете попытаться заставить что-то работать, используя New-Object, $obj.psobject.copy() и Add-Member (для определения свойств и функций подкласса), как кто-то описал здесь

ОБНОВЛЕНИЕ: наследование классов доступно в PowerShell 5.0 RTM. Пример:

class Vehicle {
    [string]$Make
    [string]$Model
    [string]$Color

}    

class Car : Vehicle {
    [string]$VIN
}

$car = [car]@{
    Make = "Ford"
    Model = "Mustang"
    Color = "Red"
    VIN = "123456"
}
$car


VIN    Make Model   Color
---    ---- -----   -----
123456 Ford Mustang Red  
person Frode F.    schedule 01.02.2015
comment
Спасибо @Frode F. - да, у меня было нутром предчувствие, что это, возможно, было чем-то, что рассматривала Microsoft, но я не видел этого комментария... Надеюсь, в v6 есть что-то похожее на "extends" или «реализует» ключевые слова, чтобы можно было программировать интерфейсы и обеспечивать безопасность типов, когда нам нужно/хотим... - person Steve Rathbone; 01.02.2015
comment
RobertW уже добавил это, но я обновил свой ответ результатами RTM (спасибо тому, кто проголосовал за это, чтобы я мог обновить свой ответ) :-) - person Frode F.; 14.03.2016

Наследование задается оператором ":" очень просто.

class Animal {
[int] $numOfLegs = 0;
[int] $numOfEyes = 2;

  Animal(){} <- Constructor         
 }


class Dog : Animal { 
        [int] $numOfLegs = 4
  Dog(){} <- Constructor of dogs
        [int] getLegs(){ return $this.numOfLegs; }
        [int] getEyes(){ return $numOfEyes; }
    }

 New-Object Dog
person RobertW    schedule 09.11.2015