PowerShell의 생성자 체인링 - 같은 클래스의 다른 생성자 호출
테스트를 하던 중에 다음과 같은 것을 우연히 발견했습니다.
원하는 대로 PoShv5에서 메서드를 오버로드할 수 있습니다.매개 변수가 없는 메서드를 호출하면 내부적으로 매개 변수가 있는 메서드를 호출하여 코드가 중복되지 않도록 유지할 수 있습니다.저는 이것이 건설업자들에게도 해당될 것이라고 기대했습니다.
이 예제에서는 마지막 생성자가 예상대로 작동하고 있습니다.다른 생성자는 설정된 값 없이 객체만 반환합니다.
Class car {
[string]$make
[string]$model
[int]$Speed
[int]$Year
speedUp (){
$this.speedUp(5)
}
speedUp ([int]$velocity){
$this.speed += $velocity
}
# Constructor
car () {
[car]::new('mall', $Null, $null)
}
car ([string]$make, [string]$model) {
[car]::new($make, $model, 2017)
}
car ([string]$make, [string]$model, [int]$Year) {
$this.make = $make
$this.model = $model
$this.Year = $year
}
}
[car]::new() # returns "empty" car
[car]::new('Make', 'Nice model') # returns also an "empty" one
[car]::new( 'make', 'nice model', 2017) # returns a "filled" instance
이것을 고칠 방법이 있습니까?제가 뭔가를 빠뜨렸나요?
Mathias R을 보완합니다. Jessen의 도움이 되는 답변:
컨스트럭터 체인의 부족을 보완하기 위해 히든 헬퍼 방법을 사용하는 것이 권장되는 방법입니다.
Class car {
[string]$Make
[string]$Model
[int]$Year
speedUp (){
$this.speedUp(5)
}
speedUp ([int]$velocity){
$this.speed += $velocity
}
# Hidden, chained helper methods that the constructors must call.
hidden Init([string]$make) { $this.Init($make, $null) }
hidden Init([string]$make, [string]$model) { $this.Init($make, $model, 2017) }
hidden Init([string]$make, [string]$model, [int] $year) {
$this.make = $make
$this.model = $model
$this.Year = $year
}
# Constructors
car () {
$this.Init('Generic')
}
car ([string]$make) {
$this.Init($make)
}
car ([string]$make, [string]$model) {
$this.Init($make, $model)
}
car ([string]$make, [string]$model, [int]$year) {
$this.Init($make, $model, $year)
}
}
[car]::new() # use defaults for all fields
[car]::new('Fiat') # use defaults for model and year
[car]::new( 'Nissan', 'Altima', 2015) # specify values for all fields
결과는 다음과 같습니다.
Make Model Year
---- ----- ----
Generic 2017
Fiat 2017
Nissan Altima 2015
참고:
그
hidden
키워드는 PowerShell 자체에서 관찰하는 규칙(예: 출력 시 이러한 멤버 생략)에 가깝습니다. 그러나 이러한 방식으로 태그가 지정된 멤버는 기술적으로 여전히 액세스할 수 있습니다.같은 클래스의 생성자를 직접 호출할 수는 없지만 C#와 같은 구문을 사용하여 기본 클래스 생성자를 호출할 수 있습니다.
TL;DR: 안돼요!
찾고 있는 것(오버로드된 생성자가 서로 연속으로 호출)은 구어적으로 생성자 체인이라고도 하며, 대략 C#에서 다음과 같이 보입니다.
class Car
{
string Make;
string Model;
int Year;
Car() : this("mall", null)
{
}
Car(string make, string model) : this(make, model, 2017)
{
}
Car(string make, string model, int Year)
{
this.Make = make;
this.Model = model;
this.Year = year;
}
}
안타깝게도 PowerShell에는 이에 대한 구문이 없는 것 같습니다. 이를 수행할 수 없습니다.
Car() : $this("Porsche") {}
Car([string]$Make) {}
시공자의 신체 정의를 놓친 것에 대해 파서가 여러분에게 토하게 하지 않고, 곧 그것을 볼 수 있을 것으로 기대하지 않습니다. PowerShell 팀은 새로운 희석 재료의 유지 관리자가 되지 않으려는 명백한 바람을 나타냈습니다.C#
- 내가 완벽하게 잘 이해할 수 있는 :-
각 생성자 정의에서 구성원 할당을 다시 구현하면 됩니다.
언급URL : https://stackoverflow.com/questions/44413206/constructor-chaining-in-powershell-call-other-constructors-in-the-same-class
'programing' 카테고리의 다른 글
JQuery에서 URL 해시/히스토리를 수행하기에 가장 좋은 라이브러리는 무엇입니까? (0) | 2023.10.03 |
---|---|
컨트롤러에서 서비스 변수가 업데이트되지 않음 (0) | 2023.10.03 |
시트의 목록 상자에서 값 가져오기 (0) | 2023.10.03 |
조건이 고유한 경우 MySQL 고유 카운트 (0) | 2023.09.28 |
Spring Boot 2.0.x가 특정 프로파일에 대해 보안을 사용하지 않도록 설정함 (0) | 2023.09.28 |