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.
returnanahtar 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-Membercmdlet'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:
- Sınıfın statik oluşturucusu.
- 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:
- Temel sınıfın statik yapıcısı.
- Türetilmiş sınıfın statik oluşturucusu.
- 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.
- 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-Membercmdlet'inin döndürdüğü sınıf üyeleri listesine dahil edilmez.Get-Memberile 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.
$thisdeğ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