2016-04-27 6 views
0

Что бы шикарно эквивалент Питона:Python в PowerShell, стволовая: Классы

class ControllerError(Exception): 


class OperationFailed(ControllerError): 

    def __init__(self, code = None, message = None): 
    super(ControllerError, self).__init__(message) 
    self.code = code 
    self.message = message 

для SO пуристы, моя попытка до сих пор:

Class ControllerError : System.Exception 
{ 

} 


Class OperationFailed : ControllerError 
{ 
    $Code 
    $Message 

    OperationFailed ($Code, $Message) 
    { 
     $this.Code = $Code 
     $this.Message = $Message 
    } 
} 

ответ

1

Что случилось с тем, что у вас есть? Это прекрасно работает в PowerShell 5.0:

Class ControllerError : System.Exception 
{ 

} 


Class OperationFailed : ControllerError 
{ 
    $Code 
    $Message 

    OperationFailed ($Code, $Message) 
    { 
     $this.Code = $Code 
     $this.Message = $Message 
    } 
} 

$o = [operationfailed]::new("500","Internal server errror") 

$o.Code 
500 

$o.Message 
Internal server errror 

$o | Get-Member | Select Name, MemberType 

Name    MemberType 
----    ---------- 
Equals    Method 
GetBaseException  Method 
GetHashCode   Method 
GetObjectData  Method 
GetType    Method 
ToString    Method 
Code    Property 
Data    Property 
HelpLink   Property 
HResult   Property 
InnerException  Property 
Message   Property 
Source    Property 
StackTrace   Property 
TargetSite   Property 

$o.gettype() 

IsPublic IsSerial Name   BaseType  
-------- -------- ----   --------  
True  False OperationFailed ControllerError 

$o.gettype().BaseType 

IsPublic IsSerial Name   BaseType   
-------- -------- ----   --------   
True  False ControllerError System.Exception 

Я рекомендовал бы указать тип для $Code и $Message, как вы, вероятно, не хотят, чтобы они System.Object. Напр .:

Class OperationFailed : ControllerError 
{ 
    [string]$Code 
    [string]$Message 

    OperationFailed ([string]$Code, [string]$Message) 
    { 
     $this.Code = $Code 
     $this.Message = $Message 
    } 
} 

Если вы действительно хотите использовать базовый конструктор (или вы хотите использовать Powershell < 5,0), то вам нужно использовать C# и Add-Type

$def = @" 
    public class ControllerError : System.Exception 
    { 
     public ControllerError(string message) : base(message) { } 
    } 


    public class OperationFailed : ControllerError 
    { 
     public string Code; 

     public OperationFailed(string code, string message) : base(message) 
     { 
      this.Code = code; 
     } 
    } 
"@ 

Add-Type -TypeDefinition $def 


$o = [OperationFailed]::new("500","internal server error")