dart中可选输入有什么特别之处

时间:2013-07-11 21:54:43

标签: dart duck-typing

“可选输入”有什么特别之处?

人们对Dart支持“可选输入”非常热衷,但是一旦语言支持鸭子打字 - 我不能认为可选输入是理所当然的吗?这不是一个明显的特征吗?

1 个答案:

答案 0 :(得分:2)

当您指定类型注释时,您将信息传递给其他开发人员和工具。

考虑两个函数的这个(相当长的)示例 - 第一个没有类型信息,第二个类型信息:

createConnection(details) {
  var foo = details.host; // assume details has a host property
  // do stuff
  return connection;
}

Connection createConnection(ConnectionParams details) {
  var foo = details.host; // tools can validate that details has a host property
  // do stuff
  return connection;
}

当你调用第一个函数时,你需要知道(从阅读API文档或源代码)该函数采用具有host字段的东西。您还需要知道该函数返回一个Connection对象,而不是字符串或其他东西。

当您调用第二个函数时,您知道可以传入符合ConnectionParams定义的接口的任何对象,并且您知道返回了Connection个对象。

假设您有两个班级:

class MySqlConn {
  String host;
}

class PostgreSqlConn {
  String host;
}


// elsewhere
var conn = new MySqlConn()..host = '127.0.0.1';
createConnection(conn);

虽然它是有效的鸭子类型,但是第一个函数和这些类之间的代码没有连接,除了它们都有一个具有相同名称的字段:host

看看这两个类,我不能说它们的一个用途是将它们的实例传递给createConnection()函数(并且工具也很难理解它)。我无法为链接回这两个类的createConnection函数创建API文档。

当您添加更多类型信息时,传达意图,突然间一切都汇集在一起​​。

// define an interface
abstract class ConnectionParams { 
  String host;
}

// inform tools and humans that MySqlConn implements the interface
class MySqlConn implements ConnectionParams {
  String host;
}

class PostgreSqlConn implements ConnectionParams {
  String host;
}

现在,工具和人类都可以在静态代码中形成从第二个createConnection函数到类以及最终界面的链接。在第一个示例中,链接仅在运行时生成。