#.net #powershell #inheritance #collections #subclass
#.net #powershell #наследование #Коллекции #подкласс
Вопрос:
У меня есть приложение, в котором я использую HashSet System.Collections.Generic.HashSet
, но хотел бы добавить к нему функциональность.
Я пытаюсь использовать наследование классов для создания подкласса HashSet
, но терплю неудачу.
Должно быть, я неправильно объявляю имя класса, но не могу найти другие примеры, которые наследуются от классов типа коллекции.
using namespace System.Collections.Generic
class StatusBucket : System.Collections.Generic.HashSet[HashSet[object]] {
[array] toArray() {
$array = [object[]]::new($this.count)
foreach ($value in $this) {
$array.Add($value)
}
return $array
}
}
$setValues = @('1', '2')
$testHashSet = [HashSet[object]]::new($ids) # Works as expected
Write-Host $testHashSet
$testStatusBucket = [StatusBucket[object]]::new($ids) # Fails
Ответ №1:
На случай, если кто-то еще окажется в подобной ситуации, я в конце концов понял это.
Вместо указания типа для набора, как это было бы в C # <T>
, вы можете сделать то же самое с помощью скобок. Вы также можете опустить пространство имен, если вы импортировали его, как обычно, в сценарии. Итак, сигнатура класса выглядит следующим образом:
using namespace System.Collections.Generic
class StatusBucket : HashSet[Object] {
}
Моя вторая проблема заключалась в том, что у меня возникли проблемы с созданием экземпляра моего нового класса. После некоторого копания я выяснил, что конструкторы не наследуются автоматически. Для того, чтобы использовать конструктор базового класса, вам нужно использовать : base()
следующее:
using namespace System.Collections.Generic
class StatusBucket : HashSet[Object] {
StatusBucket() : base() {}
# or to use additional arguments
StatusBucket($oneArgument) : base($oneArgument) {}
}
Таким образом, в этом случае конечный результат с моим дополнительным методом в конечном итоге выглядит следующим образом:
using namespace System.Collections.Generic
class StatusBucket : HashSet[object] {
StatusBucket() : base() { }
StatusBucket($collection): base($collection) { }
[array] toArray() {
$array = [object[]]::new($this.count)
$this.CopyTo($array)
return $array
}
}