Наследование от .Класс NET в PowerShell

#.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
    }
}