Ненужный бросок в дротике - PullRequest
0 голосов
/ 24 июня 2019

Учитывая, что что-то в этом роде:

class Foo {}
class Bar extends Foo {} 
class Baz extends Foo {} 

Я пишу код такого типа:

if (foo is Bar) {
   (foo as Bar).doSomething();    //Compiler warning of unnecessary cast.
} else (foo is Baz) {
   (foo as Bar).doSomething();    //Compiler warning of unnecessary cast.
}

Пожалуйста, сообщите, поскольку я не знаю, как этого избежатьситуация.

Если я удаляю типы проверки - это Bar или - это Baz до приведения, я могу получить ошибку во время выполнения, и если я не произнесу,это означает отсутствие доступа к общедоступным материалам этого типа.

Может быть, я следую неправильному дизайну кода, который мне нужно обновить, потому что я считаю, что мне следует избегать проверки типа класса.

Так что мой вопрос:

есть ли синтаксический сахар в дротике, который может помочь здесь

(foo as? Bar)?.doSomething() (как быстро)

или некоторые рекомендации по кодированию, которые помогут мне в будущем кодироватьлучший дизайн.

Ответы [ 2 ]

2 голосов
/ 24 июня 2019

На самом деле вы можете просто сделать foo.doSomething(); вместо (foo as Bar).doSomething().Компилятор знает, что если условие if(foo is Bar) оказывается истинным, переменная foo в этом блоке кода имеет тип Bar.

Try:

if (foo is Bar) {
   foo.doSomething();    // It's automatically inferred that type of `foo` is `Bar`
} else if (foo is Baz) {
   foo.doSomething();    // It's automatically inferred that type of `foo` is `Baz`
}

Надеюсь, это поможет!

0 голосов
/ 24 июня 2019

В объектно-ориентированных языках такого рода операторы if / else или switch, основанные на классе, решаются с использованием полиморфизма. Если doSomething () находится в выражении Foo, компилятор знает, что независимо от типа времени выполнения метод определен для любого дочернего элемента Foo.

Тогда, если вы знаете, что foo - это Foo, Bar или Baz, вы на самом деле должны использовать только foo.doSomething (), без проверки типов и без приведения.

Единственное, что вам нужно знать, это проверить, что foo это Foo, убедитесь, что вы используете type, а не var или dynamic:

void doSomething(dynamic foo){
    if (foo is Foo) {
       foo.doSomething(); //Ok with Foo Bar or baz
    }
    foo.doSomething(); //Possible runtime error since foo can be anything
}

Поскольку дротик типизирован, рекомендуется использовать типы, а не динамические, и вы можете написать прямо что-то вроде:

void doSomething(Foo foo){ //Making sure that you will work with a Foo
       foo.doSomething(); //Ok with Foo Bar or baz with no check
}
...