Поддерживает ли 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"
}
}