Sınıf Oluşturucuları hakkında


Kısa açıklama

PowerShell sınıfları için oluşturucuların nasıl tanımlanacağını açıklar.

Uzun açıklama

Yapıcılar, sınıfın örneğini oluştururken varsayılan değerleri ayarlamanıza ve nesne mantığını doğrulamanıza olanak tanır. Yapıcılar sınıfla aynı adı taşır. Yapıcılar, yeni nesnenin veri üyelerini başlatmak için parametrelere sahip olabilir.

PowerShell sınıfı yapıcıları, sınıf üzerinde özel yöntemler olarak tanımlanır. Aşağıdaki istisnalar dışında PowerShell sınıfı yöntemleriyle aynı şekilde davranırlar:

  • Yapıcıların bir çıktı türü yoktur. return anahtar kelimesini kullanamazlar.
  • Yapıcılar her zaman sınıfla aynı adı taşır.
  • Yapıcılar doğrudan çağrılamaz. Yalnızca bir örnek oluşturulduğunda çalışırlar.
  • Yapıcılar hiçbir zaman Get-Member cmdlet'inin çıktısında görünmez.

PowerShell sınıfı yöntemleri hakkında daha fazla bilgi için bkz. about_Classes_Methods.

Sınıfta sıfır veya daha fazla kurucu tanımlanmış olabilir. Hiçbir kurucu tanımlanmamışsa, sınıfa varsayılan parametresiz bir kurucu verilir. Bu yapıcı tüm üyeleri varsayılan değerlerine başlatır. Nesne türlerine ve dizelere boş değerler verilir. Kurucuyu tanımladığınızda varsayılan parametresiz kurucu oluşturulmaz. Gerekirse parametresiz bir kurucu oluşturun.

Ayrıca parametresiz bir statik kurucu da tanımlayabilirsiniz.

Sözdizimi

Sınıf yapıcıları aşağıdaki sözdizimlerini kullanır:

Varsayılan yapıcı sözdizimi

<class-name> () [: base([<params>])] {
    <body>
}

Statik oluşturucu sözdizimi

static <class-name> () [: base([<params>])] {
    <body>
}

Parametreli yapıcı sözdizimi (tek satır)

<class-name> ([[<parameter-type>]$<parameter-name>[, [<parameter-type>]$<parameter-name>...]]) [: base([<params>])] {
    <body>
}

Parametreli oluşturucu sözdizimi (çok satırlı)

<class-name> (
    [<parameter-type>]$<parameter-name>[,
    [<parameter-type>]$<parameter-name>...]
) [: base([<params>])] {
    <body>
}

Örnekler

Örnek 1 - Varsayılan kurucuyla bir sınıf tanımlama

ExampleBook1 sınıfı bir kurucu tanımlamaz. Bunun yerine otomatik varsayılan kurucuyu kullanır.

class ExampleBook1 {
    [string]   $Name
    [string]   $Author
    [int]      $Pages
    [datetime] $PublishedOn
}

[ExampleBook1]::new()
Name Author Pages PublishedOn
---- ------ ----- -----------
                0 1/1/0001 12:00:00 AM

Not

Ad ve Author özelliklerinin varsayılan değeri $null'dur çünkü bunlar bir referans türü olan dizeler olarak yazılmıştır. Diğer özellikler, değer türü özellikleri olduğundan, tanımlı türleri için varsayılan değere sahiptir. Özellikler için varsayılan değerler hakkında daha fazla bilgi için about_Classes_Properties bölümündeki "Varsayılan özellik değerleri" konusuna bakın.

Örnek 2 - Varsayılan kurucunun geçersiz kılınması

ExampleBook2, PublishedOn'un değerlerini geçerli tarihe ve Pages'in değerlerini 1'e ayarlayarak varsayılan oluşturucuyu açıkça tanımlar.

class ExampleBook2 {
    [string]   $Name
    [string]   $Author
    [int]      $Pages
    [datetime] $PublishedOn

    ExampleBook2() {
        $this.PublishedOn = (Get-Date).Date
        $this.Pages       = 1
    }
}

[ExampleBook2]::new()
Name Author Pages PublishedOn
---- ------ ----- -----------
                1 11/1/2023 12:00:00 AM

Örnek 3 - Yapıcı aşırı yüklerini tanımlama

ExampleBook3 sınıfı, üç yapıcı aşırı yüklemesini tanımlayarak kullanıcıların, her özellik değerini ileterek ve kitabın ve yazarın adını ileterek bir hash tablosundan sınıfın bir örneğini oluşturmasına olanak tanır. Sınıf, varsayılan kurucuyu tanımlamaz.

class ExampleBook3 {
    [string]   $Name
    [string]   $Author
    [int]      $Pages
    [datetime] $PublishedOn

    ExampleBook3([hashtable]$Info) {
        switch ($Info.Keys) {
            'Name'        { $this.Name        = $Info.Name }
            'Author'      { $this.Author      = $Info.Author }
            'Pages'       { $this.Pages       = $Info.Pages }
            'PublishedOn' { $this.PublishedOn = $Info.PublishedOn }
        }
    }

    ExampleBook3(
        [string]   $Name,
        [string]   $Author,
        [int]      $Pages,
        [datetime] $PublishedOn
    ) {
        $this.Name        = $Name
        $this.Author      = $Author
        $this.Pages       = $Pages
        $this.PublishedOn = $PublishedOn
    }

    ExampleBook3([string]$Name, [string]$Author) {
        $this.Name   = $Name
        $this.Author = $Author
    }
}

[ExampleBook3]::new(@{
    Name        = 'The Hobbit'
    Author      = 'J.R.R. Tolkien'
    Pages       = 310
    PublishedOn = '1937-09-21'
})
[ExampleBook3]::new('The Hobbit', 'J.R.R. Tolkien', 310, '1937-09-21')
[ExampleBook3]::new('The Hobbit', 'J.R.R. Tolkien')
[ExampleBook3]::new()
Name       Author         Pages PublishedOn
----       ------         ----- -----------
The Hobbit J.R.R. Tolkien   310 9/21/1937 12:00:00 AM
The Hobbit J.R.R. Tolkien   310 9/21/1937 12:00:00 AM
The Hobbit J.R.R. Tolkien     0 1/1/0001 12:00:00 AM

MethodException:
Line |
  42 |  [ExampleBook3]::new()
     |  ~~~~~~~~~~~~~~~~~~~~~
     | Cannot find an overload for "new" and the argument count: "0".

Varsayılan kurucuyu çağırmak bir yöntem istisnası döndürür. Otomatik varsayılan kurucu, yalnızca sınıf herhangi bir kurucu tanımlamadığında bir sınıf için tanımlanır. ExampleBook3 birden fazla aşırı yüklemeyi tanımladığından, varsayılan oluşturucu sınıfa otomatik olarak eklenmez.

Örnek 4 - Oluşturucuların paylaşılan bir yöntemle zincirlenmesi

Bu örnek, yapıcılar için yeniden kullanılabilir paylaşılan kodu nasıl yazabileceğinizi gösterir. PowerShell sınıfları yapıcı zincirlemeyi kullanamaz; dolayısıyla bu örnek sınıf bunun yerine bir Init() yöntemini tanımlar. Yöntemin birkaç aşırı yüklemesi var. Daha az parametreye sahip aşırı yüklemeler, belirtilmemiş parametreler için varsayılan değerlere sahip daha açık aşırı yüklemeleri çağırır.

class ExampleBook4 {
    [string]   $Name
    [string]   $Author
    [datetime] $PublishedOn
    [int]      $Pages

    ExampleBook4() {
        $this.Init()
    }
    ExampleBook4([string]$Name) {
        $this.Init($Name)
    }
    ExampleBook4([string]$Name, [string]$Author) {
        $this.Init($Name, $Author)
    }
    ExampleBook4([string]$Name, [string]$Author, [datetime]$PublishedOn) {
        $this.Init($Name, $Author, $PublishedOn)
    }
    ExampleBook4(
      [string]$Name,
      [string]$Author,
      [datetime]$PublishedOn,
      [int]$Pages
    ) {
        $this.Init($Name, $Author, $PublishedOn, $Pages)
    }

    hidden Init() {
        $this.Init('Unknown')
    }
    hidden Init([string]$Name) {
        $this.Init($Name, 'Unknown')
    }
    hidden Init([string]$Name, [string]$Author) {
        $this.Init($Name, $Author, (Get-Date).Date)
    }
    hidden Init([string]$Name, [string]$Author, [datetime]$PublishedOn) {
        $this.Init($Name, $Author, $PublishedOn, 1)
    }
    hidden Init(
        [string]$Name,
        [string]$Author,
        [datetime]$PublishedOn,
        [int]$Pages
      ) {
        $this.Name        = $Name
        $this.Author      = $Author
        $this.PublishedOn = $PublishedOn
        $this.Pages       = $Pages
    }
}

[ExampleBook4]::new()
[ExampleBook4]::new('The Hobbit')
[ExampleBook4]::new('The Hobbit', 'J.R.R. Tolkien')
[ExampleBook4]::new('The Hobbit', 'J.R.R. Tolkien', (Get-Date '1937-9-21'))
[ExampleBook4]::new(
    'The Hobbit',
    'J.R.R. Tolkien',
    (Get-Date '1937-9-21'),
    310
)
Name       Author         PublishedOn           Pages
----       ------         -----------           -----
Unknown    Unknown        11/1/2023 12:00:00 AM     1
The Hobbit Unknown        11/1/2023 12:00:00 AM     1
The Hobbit J.R.R. Tolkien 11/1/2023 12:00:00 AM     1
The Hobbit J.R.R. Tolkien 9/21/1937 12:00:00 AM     1
The Hobbit J.R.R. Tolkien 9/21/1937 12:00:00 AM   310

Örnek 5 - Türetilmiş sınıf oluşturucuları

Aşağıdaki örneklerde, bir temel sınıf ve temel sınıftan miras alınan türetilmiş bir sınıf için statik, varsayılan ve parametreli oluşturucuları tanımlayan sınıflar kullanılır.

class BaseExample {
    static [void] DefaultMessage([type]$Type) {
        Write-Verbose "[$($Type.Name)] default constructor"
    }

    static [void] StaticMessage([type]$Type) {
        Write-Verbose "[$($Type.Name)] static constructor"
    }

    static [void] ParamMessage([type]$Type, [object]$Value) {
        Write-Verbose "[$($Type.Name)] param constructor ($Value)"
    }

    static BaseExample() { [BaseExample]::StaticMessage([BaseExample])  }
    BaseExample()        { [BaseExample]::DefaultMessage([BaseExample]) }
    BaseExample($Value)  { [BaseExample]::ParamMessage([BaseExample], $Value) }
}

class DerivedExample : BaseExample {
    static DerivedExample() { [BaseExample]::StaticMessage([DerivedExample])  }
           DerivedExample() { [BaseExample]::DefaultMessage([DerivedExample]) }

    DerivedExample([int]$Number) : base($Number) {
        [BaseExample]::ParamMessage([DerivedExample], $Number)
    }
    DerivedExample([string]$String) {
        [BaseExample]::ParamMessage([DerivedExample], $String)
    }
}

Aşağıdaki blok, temel sınıf yapıcılarını çağırmak için ayrıntılı mesajlaşmayı gösterir. Statik yapıcı mesajı yalnızca sınıfın bir örneği ilk kez oluşturulduğunda yayınlanır.

PS> $VerbosePreference = 'Continue'
PS> $b = [BaseExample]::new()

VERBOSE: [BaseExample] static constructor
VERBOSE: [BaseExample] default constructor

PS> $b = [BaseExample]::new()

VERBOSE: [BaseExample] default constructor

PS> $b = [BaseExample]::new(1)

VERBOSE: [BaseExample] param constructor (1)

Bir sonraki blok, yeni bir oturumda türetilmiş sınıf kurucularının çağrılması için ayrıntılı mesajlaşmayı gösterir. Türetilmiş bir sınıf kurucusu ilk kez çağrıldığında, temel sınıf ve türetilmiş sınıf için statik kurucular çağrılır. Bu yapıcılar oturumda tekrar çağrılmaz. Temel sınıfın yapıcıları her zaman türetilmiş sınıfın yapıcılarından önce çalışır.

PS> $VerbosePreference = 'Continue'
PS> $c = [DerivedExample]::new()

VERBOSE: [BaseExample] static constructor
VERBOSE: [DerivedExample] static constructor
VERBOSE: [BaseExample] default constructor
VERBOSE: [DerivedExample] default constructor

PS> $c = [DerivedExample]::new()

VERBOSE: [BaseExample] default constructor
VERBOSE: [DerivedExample] default constructor

PS> $c = [DerivedExample]::new(1)

VERBOSE: [BaseExample] param constructor (1)
VERBOSE: [DerivedExample] param constructor (1)

PS> $c = [DerivedExample]::new('foo')

VERBOSE: [BaseExample] default constructor
VERBOSE: [DerivedExample] param constructor (foo)

Yapıcı çalıştırma sıralaması

Bir sınıf başlatıldığında, bir veya daha fazla kurucunun kodu yürütülür.

Başka bir sınıftan miras almayan sınıflar için sıralama şu şekildedir:

  1. Sınıfın statik oluşturucusu.
  2. Sınıf için geçerli yapıcı aşırı yükü.

Başka bir sınıftan miras alan türetilmiş sınıflar için sıralama şu şekildedir:

  1. Temel sınıfın statik yapıcısı.
  2. Türetilmiş sınıfın statik oluşturucusu.
  3. Türetilmiş sınıf kurucusu açıkça bir temel kurucu aşırı yüklemesini çağırırsa, o kurucuyu temel sınıf için çalıştırır. Açıkça bir temel kurucuyu çağırmıyorsa, temel sınıf için varsayılan kurucuyu çalıştırır.
  4. Türetilmiş sınıf için geçerli yapıcı aşırı yükü.

Her durumda, statik kurucular bir oturumda yalnızca bir kez çalışır.

Yapıcı davranışı ve sıralama örneği için Örnek 5'e bakın.

Gizli kurucular

Bir sınıfın yapıcılarını hidden anahtar sözcüğüyle bildirerek gizleyebilirsiniz. Gizli sınıf yapıcıları şunlardır:

  • Sınıfın varsayılan çıktısına dahil edilmez.
  • Get-Member cmdlet'inin döndürdüğü sınıf üyeleri listesine dahil edilmez. Get-Member ile gizli özellikleri göstermek için Force parametresini kullanın.
  • Tamamlama gizli özelliği tanımlayan sınıfta gerçekleşmediği sürece sekme tamamlamada veya IntelliSense'te görüntülenmez.
  • Sınıfın genel üyeleri. Bunlara erişilebilir ve değiştirilebilir. Bir mülkü gizlemek onu özel yapmaz. Yalnızca önceki noktalarda açıklandığı gibi özelliği gizler.

Not

Herhangi bir kurucuyu gizlediğinizde new() seçeneği IntelliSense ve tamamlama sonuçlarından kaldırılır.

gizli anahtar sözcüğü hakkında daha fazla bilgi için bkz. about_Hidden.

Statik kurucular

Kurucuyu static anahtar sözcüğüyle bildirerek, bir kurucuyu sınıfın örnekleri yerine sınıfın kendisine ait olacak şekilde tanımlayabilirsiniz. Statik sınıf yapıcıları:

  • Yalnızca oturumda sınıfın bir örneği ilk kez oluşturulduğunda çağırın.
  • Herhangi bir parametre olamaz.
  • $this değişkeniyle örnek özelliklerine veya yöntemlerine erişilemiyor.

Türetilmiş sınıflar için yapıcılar

Bir sınıf başka bir sınıftan miras aldığında, yapıcılar temel sınıftan bir yapıcıyı base anahtar sözcüğüyle çağırabilirler. Türetilmiş sınıf açıkça temel sınıftan bir kurucuyu çağırmazsa, bunun yerine temel sınıf için varsayılan kurucuyu çağırır.

Varsayılan olmayan bir temel kurucuyu çağırmak için, yapıcı parametrelerinden sonra ve gövde bloğundan önce : base() ekleyin.

class <derived-class> : <base-class> {
    <derived-class>(<derived-parameters>) : <base-class>(<base-parameters>) {
        # initialization code
    }
}

Temel sınıf yapıcısını çağıran bir yapıcıyı tanımlarken parametreler aşağıdaki öğelerden herhangi biri olabilir:

  • Türetilmiş sınıf yapıcısındaki herhangi bir parametrenin değişkeni.
  • Herhangi bir statik değer.
  • Parametre türünün değerini değerlendiren herhangi bir ifade.

Türetilmiş bir sınıftaki yapıcıların bir örneği için Örnek 5'e bakın.

Zincirleme yapıcılar

C#'tan farklı olarak PowerShell sınıfı oluşturucuları : this() sözdizimiyle zincirlemeyi kullanamaz. Kod tekrarını azaltmak için aynı etkiye sahip birden fazla aşırı yüklemeye sahip gizli bir Init() yöntemini kullanın. Örnek 4, bu modeli kullanan bir sınıfı göstermektedir.

Update-TypeData ile örnek özellikleri ve yöntemleri ekleme

Özellikleri ve yöntemleri doğrudan sınıf tanımında bildirmenin ötesinde, Update-TypeData cmdlet'ini kullanarak statik oluşturucuda bir sınıfın örnekleri için özellikleri tanımlayabilirsiniz.

Bu parçayı model için bir başlangıç noktası olarak kullanın. Açılı parantez içindeki yer tutucu metni gerektiği gibi değiştirin.

class <class-name> {
    static [hashtable[]] $MemberDefinitions = @(
        @{
            Name       = '<member-name>'
            MemberType = '<member-type>'
            Value      = <member-definition>
        }
    )

    static <class-name>() {
        $TypeName = [<class-name>].Name
        foreach ($Definition in [<class-name>]::MemberDefinitions) {
            Update-TypeData -TypeName $TypeName @Definition
        }
    }
}

Yararlı ipucu

Add-Member cmdlet'i, statik olmayan kuruculardaki bir sınıfa özellikler ve yöntemler ekleyebilir, ancak cmdlet, kurucu her çağrıldığında çalıştırılır. Statik oluşturucuda Update-TypeData'nın kullanılması, üyelerin sınıfa eklenmesine yönelik kodun oturumda yalnızca bir kez çalıştırılmasının yeterli olmasını sağlar.

Salt okunur özellikler gibi, yalnızca Update-TypeData ile tanımlanamayan statik olmayan oluşturuculardaki özellikleri sınıfa ekleyin.

Update-TypeData ile örnek yöntemlerini tanımlama hakkında daha fazla bilgi için bkz. about_Classes_Methods. Örnek özelliklerini Update-TypeData ile tanımlama hakkında daha fazla bilgi için bkz. about_Classes_Properties.

Sınırlamalar

PowerShell sınıfı oluşturucularının aşağıdaki sınırlamaları vardır:

  • Yapıcı zincirleme uygulanmadı.

    Geçici Çözüm: Gizli Init() yöntemlerini tanımlayın ve bunları yapıcıların içinden çağırın.

  • Yapıcı parametreleri, doğrulama nitelikleri de dahil olmak üzere hiçbir özelliği kullanamaz.

    Geçici Çözüm: Yapıcı gövdesindeki parametreleri doğrulama özelliğiyle yeniden atayın.

  • Yapıcı parametreleri varsayılan değerleri tanımlayamaz. Parametreler her zaman zorunludur.

    Geçici Çözüm: Yok.

  • Bir yapıcının herhangi bir aşırı yüklemesi gizlenmişse, yapıcının her aşırı yüklemesi de gizli olarak ele alınır.

    Geçici Çözüm: Yok.

Ayrıca bakınız

  • about_Classes
  • about_Classes_Inheritance
  • about_Classes_Methods
  • about_Classes_Properties

İlgili makaleler