Поддерживает ли PowerShell ООП?

Как насчет таких понятий, как класс, интерфейс, Mixin в PowerShell? Поддерживает ли он ООП? Если да, то где я могу прочитать об этом?

4 ответов


Вы можете определить новые типы в PowerShell версии 2.0 с помощью :

ПОДРОБНОЕ ОПИСАНИЕ

командлет Add-Type позволяет определить класс .NET в сеансе Windows PowerShell. Затем можно создавать экземпляры объектов (с помощью командлета New-Object) и использовать объекты, как и любой .NET ob джект. При добавлении команды Add-Type в профиль Windows PowerShell класс будет доступен во всех окнах Сеансах PowerShell.

вы можете указать тип, указав существующую сборку или файлы исходного кода, или вы можете указать исходный код в строке или сохранить в переменной. Вы даже можете указать только метод, и Add-Type определит и создайте класс. Эту функцию можно использовать для вызова вызова платформы (P/Invoke) неуправляемых функций в Windows PowerShell. Если указан исходный код, Add-Type компилирует указанный исходный код co de и генерирует в памяти сборка, содержащая новые типы .NET.

вы можете использовать параметры Add-Type для указания альтернативного языка и компилятора (по умолчанию используется CSharp), параметров компилятора, зависимостей сборки, пространства имен классов и имен типа и результирующая сборка.

help Add-Type для получения дополнительной информации.

Также см.:


PowerShell-это скорее язык потребителя ООП. Он может использовать большую часть .NET Framework, но он изначально не поддерживает создание интерфейсов, классов и, конечно, не mixins. .NET, на котором основана система типов PowerShell, не поддерживает mixins. PowerShell поддерживает динамическое добавление свойств и методов к существующему объекту с помощью командлета Add-Member.

Add-Type полезен, но если вам нужно перейти на C# или VB, чтобы определить класс или класс, который реализует определенный интерфейс, я бы не считал, что первый класс поддерживает создание классов/интерфейсов.

Если вы ищете бесплатный учебный материал, проверьте Эффективная Оболочка Windows PowerShell.


конвейер PowerShell имеет дело с объектами, а не только с текстовым потоком, который делает конвейер Unix. Все переменные также являются экземплярами объектов. Это все объекты .NET, кстати.

вот часть вывода команды "ls", переданной командлету get-member:

    PS C:\Documents and Settings\Administrator.DEV-3DPST1-SWK> ls | get-member


   TypeName: System.IO.DirectoryInfo

Name                      MemberType     Definition
----                      ----------     ----------
Create                    Method         System.Void Create(DirectorySecurity directorySecurity), System.Void Create()
CreateObjRef              Method         System.Runtime.Remoting.ObjRef CreateObjRef(Type requestedType)
CreateSubdirectory        Method         System.IO.DirectoryInfo CreateSubdirectory(String path), System.IO.Director...
Delete                    Method         System.Void Delete(), System.Void Delete(Boolean recursive)
Equals                    Method         System.Boolean Equals(Object obj)
GetAccessControl          Method         System.Security.AccessControl.DirectorySecurity GetAccessControl(), System....
GetDirectories            Method         System.IO.DirectoryInfo[] GetDirectories(String searchPattern), System.IO.D...
GetFiles                  Method         System.IO.FileInfo[] GetFiles(String searchPattern), System.IO.FileInfo[] G...
GetFileSystemInfos        Method         System.IO.FileSystemInfo[] GetFileSystemInfos(String searchPattern), System...
GetHashCode               Method         System.Int32 GetHashCode()
GetLifetimeService        Method         System.Object GetLifetimeService()
GetObjectData             Method         System.Void GetObjectData(SerializationInfo info, StreamingContext context)
GetType                   Method         System.Type GetType()
get_Attributes            Method         System.IO.FileAttributes get_Attributes()
get_CreationTime          Method         System.DateTime get_CreationTime()

get-member отображает элементы объекта, который вы передаете ему. Вы можете видеть, что это фактические члены системы.ИО.Класс DirectoryInfo.


версия 5 Powershell, похоже, поддерживает некоторые из основных ООП.

все заслуги этого парня:https://xainey.github.io/2016/powershell-classes-and-concepts/

пример класса:

    class myColor
    {
        [String] $Color
        [String] $Hex

        myColor([String] $Color, [String] $Hex)
        {
            $this.Color = $Color
            $this.Hex = $Hex
        }

        [String] ToString()
        {
            return $this.Color + ":" + $this.Hex
        }
    }

пример абстрактного класса:

class Foo
{
    Foo ()
    {
        $type = $this.GetType()

        if ($type -eq [Foo])
        {
            throw("Class $type must be inherited")
        }
    }

    [string] SayHello()
    {
        throw("Must Override Method")
    }
}

class Bar : Foo
{
    Bar ()
    {

    }

    [string] SayHello()
    {
        return "Hello"
    }
}