你可以在类中创建辅助函数而不实例化该类的对象吗?

时间:2016-01-19 16:31:34

标签: dart

我有一个类,它具有实例化对象的功能,但我知道其他语言将在类中具有公共的辅助函数而不显式定义对象。

DART语言网站似乎没有真正解决它。在一个简单的例子中,它可能类似于Point类,然后在其中有一个jsondecoder,可能有一些用处,而不需要包含其他库。

class Point {
  int x, y;
  Point(this.x, this.y);

  Point fromMap(HashMap<String, int> pt){
    return new Point(pt["x"]||null, pt["y"]||null);
  }
}

当我需要使用Point类时,我可以这么说:

Point pt = Point.fromMap({});

我没有真正看到任何关于我何时翻阅课程以便公开宣传这些内容的例子。

3 个答案:

答案 0 :(得分:7)

Dart允许在类上定义静态成员。在你的情况下:

class Point {
  int x, y;
  Point(this.x, this.y);

  static Point fromMap(Map<String, int> pt) {
    return new Point(pt["x"], pt["y"]);
  }
}

值得注意的是,您还可以使用命名构造函数和/或工厂构造函数:

class Point {
  int x, y;
  Point(this.x, this.y);

  // use it with new Point.fromMap(pt)
  Point.fromMap(Map<String, int> pt) : this(pt["x"], pt["y"]);

  // use it with new Point.fromMap2(pt)
  factory Point.fromMap2(Map<String, int> pt) => new Point(pt["x"], pt["y"]);
}

答案 1 :(得分:2)

给定的示例可能不是最好的,因为期望的结果是新的Point。正如亚历山大在他的回答中所说的那样,被命名的构造者是这种情况下的首选解决方案。

也许一个更好的例子(但仍然有点人为)将是:

library Points;

class Point {

  ...

  /// Return true if data in pt is valid [Point] data, false otherwise. 
  bool isValidData(HashMap<String, int> pt) { ... }
}

在没有第一类功能的语言(例如Java)中,静态方法是正确的。 Dart也支持这一点。

class Point {

  ...

  /// Return true if data in pt is valid [Point] data, false otherwise. 
  static bool isValidData(HashMap<String, int> pt) { ... }
}

由于Dart具有第一类函数,因此库中定义的函数可能是更好的选择。

library Points;

bool isValidPointData(HashMap<String, int> pt) { ... }

class Point {
  ...
}

答案 2 :(得分:1)

查找静态修改器:静态点fromMap(...)如果Dart具有这样的功能。