1

在以下示例中,允许main调用 Dog 上的嗅探函数,我希望它会以某种方式中断。如果我确切地说 Dog 可以做什么,但不知何故,客户端知道得更多,并且可以让对象利用这些特殊知识做更多事情——我认为这是封装泄漏。在一般情况下,我不一定希望它死掉,但是是否有一个标志或运行方式可以强制只调用存在的方法。我知道该语言支持错误的知识,因为 Dart 编辑器显示警告:未为类 'Dog' 定义方法 'sniff'。即使使用--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

这是不可能的。问题是您的实例确实BigDog; 因此它确实有一个sniff方法。Dart 的一个重要目标是类型注释影响运行时行为。因此您的Dog注释无法改变行为。

该工具能够突出显示这一点,因为它确实使用了类型注释。

这类问题在 Dart 错误跟踪器中出现了很多。但是允许类型注释改变行为将是一个非常根本的变化,所以我期望不会考虑这件事;尽管可能令人困惑。有关这方面的更多信息,请参见此处。

于 2014-09-14T14:20:39.600 回答
1

您应该确保在checked mode dart -c testfile.dart考虑类型注释时运行测试。您不应该checked mode在生产中使用,因为它会减慢您的应用程序。

于 2014-09-14T14:25:13.973 回答