1

次の例では、mainがDogのsniff関数を呼び出すことが許可されています。犬ができることを正確に言うと、どういうわけかクライアントはより多くのことを知っていて、その特別な知識でオブジェクトにもっと多くのことをさせることができます-それはカプセル化リークだと思います. 一般的なケースで必ずしも死ぬことを望んでいるわけではありませんが、メソッドが存在する場合にのみメソッドが呼び出されるようにするフラグまたは実行方法はありますか。Dart エディターが警告を表示するため、言語が何かが間違っているという知識をサポートしていることを私は知っています: The method 'sniff' is not defined for the class 'Dog' . --checkedフラグを付けて実行しても、これは問題なく実行されます。

したがって、同様のコードがテストによって呼び出されたとします。テストの実行時に Dart を失敗させるフラグやコードはありますか?

abstract class Dog {
  void run();
  void bark();
}

class BigDog implements Dog {
  void run() => print("Big dog running");
  void bark() => print("Woof");
  void sniff() => print("Sniff");
}

main() {
  Dog bd = new BigDog();
  bd.run();
  bd.bark();
  bd.sniff();
}
4

2 に答える 2

1

checked mode dart -c testfile.dart型注釈が考慮されるように、テストを確実に実行する必要があります。checked modeただし、アプリケーションの速度が低下するため、本番環境では使用しないでください。

于 2014-09-14T14:25:13.973 に答える
1

これは不可能です。問題は、インスタンスが実際BigDogに;であることです。したがって、実際にsniffメソッドがあります。Dart の重要な目標は、型注釈が実行時の動作に影響を与えないことです。したがって、Dog注釈は動作を変更できません。

ツールは型注釈を使用するため、これを強調表示できます。

この種の質問は、Dart バグ トラッカーでよく出てきます。しかし、型注釈が動作を変更できるようにすることはかなり根本的な変更になるため、これまで考慮されることはないと思います。紛らわしいかもしれません。詳細については、こちらを参照してください。

于 2014-09-14T14:20:39.600 に答える