【问题标题】:Why does dart has got special keywords for get and set?为什么 dart 有 get 和 set 的特殊关键字?
【发布时间】:2020-08-13 08:44:38
【问题描述】:

我是 Flutter 的新手,我只是想知道 getter 和 setter 的特殊关键字。为什么 dart 为 getter 和 setter 分别保留了特殊关键字 getset?有什么特别的原因吗,因为和其他语言一样,它也可以用简单的函数来完成。

dart 中的示例,我们有 get 和 set 关键字。

class Person {
  String _name;
  String get name => _name;
  set name (String val) => _name = val;
}

在 java 中,我们使用公共方法来做同样的事情。

// Java, No get, set keywords used
public class Person {
  private String name; // private = restricted access

  // Getter
  public String getName() {
    return name;
  }

  // Setter
  public void setName(String newName) {
    this.name = newName;
  }
}

为什么我们在 dart 中需要单独的 get 和 set 关键字?这与我们在 java 中使用的普通 getter 和 setter 方法有什么不同,cop

我们可以简单地使用

class Person {
  String _name;

  String getName() => _name;
  void setName(String val) => _name=val; 
}

我知道这有点像直接使用变量而不是方法,我的问题是,有什么我们不能用简单的 getter 和 setter 方法实现的,我们可以使用 getset 关键字来实现吗?

【问题讨论】:

  • 你能澄清一下你指的是哪些其他语言,并提供一个例子吗?例如kotlin 也有一个 get/set 关键字。我想不出一种允许用“普通”方法覆盖属性的语言。
  • @herbert java, cpp, python
  • 你不能用 java.. 和 python 中的方法重载类成员变量,也可以作为 getattr/setattr 的 @property 语法糖
  • getset 用于自定义 getter 和 setter,以防您想要覆盖默认实现,或者拥有没有支持字段的属性。然后,您可以使用具有正常属性语法的自定义 getter 和 setter(例如 String get fullName { return "$firstName $lastName"; } ... print(foo.fullName);

标签: flutter dart


【解决方案1】:

这基本上是为了方便和向后兼容。假设您从一个公共字段开始:

class Person {
  final String name;
}

但是你决定 name 应该是一个基于名字和姓氏的计算字段:

class Person {
  final String lastName;
  final String firstName;
  String get name => '$firstName $lastName';
}

在 java 中,最好的做法是永远不要拥有公共类成员变量,因为它无法在不更改 API 的情况下转换到方法。所以你总是必须编写 getVariable() 访问方法,即使 99% 的方法只有 return variable; 作为主体。

【讨论】:

    猜你喜欢
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    相关资源
    最近更新 更多