2016-04-20 5 views
1

Gibt es eine korrekte/beste/eine beliebige Art, eine Singleton-Klasse mithilfe der Klassenkonstrukte in PowerShell 5.0 zu erstellen? Ich habe so etwas wie dies versucht:Powershell 5 Klassen und Singleton

class ScannerGeometry 
{ 
    [int] $EEprom;    # read eeprom 
    # .... 

    ScannerGeometry() 
    { 
     # ... fetch calibration from instrument 
    } 

    [ScannerGeometry] Instance() { 
     if ($this -eq $null) 
     { 
      $this = [ScannerGeometry]::new() 
     } 
     return $this 
    } 
} 

Und es mit so etwas wie die Zuordnung:

$scanner = [ScannerGeometry]::Instance() 

Ach, erhalte ich einen Laufzeitfehler von Method invocation failed because [ScannerGeometry] does not contain a method named 'Instance'.

Auch kann man den Konstruktor machen (oder eine andere Methode) privat in PS5-Klassen?

+0

huh, wurde durch 'get-help about_Classes -Full' Skimming heute früher :) –

Antwort

2

Ihre Methode ist wie folgt sichtbar, da es nicht statisch ist:

[ScannerGeometry]::new() | set x 
PS C:\Work> $x | gm 


    TypeName: ScannerGeometry 

Name  MemberType Definition 
----  ---------- ---------- 
Equals  Method  bool Equals(System.Object obj) 
GetHashCode Method  int GetHashCode() 
GetType  Method  type GetType() 
Instance Method  ScannerGeometry Instance() 
ToString Method  string ToString() 
EEprom  Property int EEprom {get;set;} 

Sie benötigen static Schlüsselwort zu verwenden. In diesem Fall ist $this ungültig, daher müssen Sie den Code etwas ändern. Hier ist der Code:

class ScannerGeometry 
{ 
    [int] $EEprom;    # read eeprom 


    static [ScannerGeometry] Instance() { 
      return [ScannerGeometry]::new() 
    } 
} 

EDIT

Ok, hier ist der Arbeitscode:

class ScannerGeometry 
{ 
    [int] $EEprom    # read eeprom 

    static [ScannerGeometry] $instance 


    static [ScannerGeometry] GetInstance() { 
      if ([ScannerGeometry]::instance -eq $null) { [ScannerGeometry]::instance = [ScannerGeometry]::new() } 
      return [ScannerGeometry]::instance 
    } 
} 

$s = [ScannerGeometry]::GetInstance() 
+0

hilfreich, aber ich bekomme eine neue/andere Instanz mit jedem Aufruf von '[ScannerGeometry] Instance()' kein Singleton-Verhalten. Ich kann eine externe Variable verwenden $ Global: scannerObject = [ScannerGeometry] :: new() 'aber das scheint ... schmutzig? –

+0

Siehe meine bearbeitete Antwort. – majkinetor

+2

Leute, vergib meine Unwissenheit, aber wie, warum willst du ein Singleton instantiieren? –

1

Wie wäre das?

class ScannerGeometry 
{ 
    [int] $EEprom;    # read eeprom 
    # .... 

    ScannerGeometry() 
    { 
     # ... fetch calibration from instrument 
    } 

    [ScannerGeometry] Instance() { 
     if ($this -eq $null) 
     { 
      $this = [ScannerGeometry]::new() 
     } 
     return $this 
    } 
} 

$scangeo = [ScannerGeometry]::new().Instance() 

PS: Der Code gibt nur keinen Fehler, ich bin völlig ahnungslos über die Singleton Kontext :(

Source : HSGB

+0

Wenn Sie die Funktion statisch machen Sie verlieren die Fähigkeit, $ dies zu verweisen. Ohne statisch zu machen, können Sie die Methode nicht aufrufen, bis Sie die Klasse instanziieren. Was Sie wollen, ist eine Fähigkeit, nicht jedes Mal, wenn Sie die Klasse referenzieren müssen, einen neuen Namen zu erhalten - also ein Singleton. –

+0

hm, "nicht jedes Mal neu anrufen, wenn du die Klasse referenzieren willst", könntest du das näher erläutern? –

Verwandte Themen