Конкретизация типа для обобщений¶
Скажем, у вас есть что-то, например класс Foo, который имеет обобщённый параметр:
1 2 3 | |
Вы хотите создать для него уточнённую версию для определенного типа. Паттерн состоит в том, чтобы скопировать элемент в новую переменную и дать ей описание типа с заменой обобщённых типов конкретными типами. Например, если вам нужен класс Foo<number>:
1 2 3 4 | |
В ссылке 1 вы говорите, что FooNumber это то же самое, что Foo, но просто относитесь к нему как к чему-то, что при вызове с оператором new дает экземпляр Foo<Number>.
Наследование¶
Паттерн утверждения типа небезопасен, поскольку он доверяет вам сделать всё правильно. Распространенный паттерн в других языках для классов - просто использовать наследование:
1 | |
Одно предостережение: если вы используете декораторы в базовом классе, то унаследованный класс может не иметь того же поведения, что и базовый класс (он больше не обёрнут декоратором).
Даже если вы не уточняете свои классы, вам все равно нужно придумать паттерн приведения / утверждения, который работает, для начала покажем общий шаблон утверждения, например:
1 2 3 4 | |
Меня вдохновил этот вопрос на stackoverflow