• dart 学习 之 Getters and setters


    前言

    任何需要对属性进行更多控制而不是允许简单字段访问的时候,你都可以自定义 getter 和 setter。

    正文

    讲解

    Getter(获取器)和Setter(设置器)是面向对象编程中用于控制对类属性访问的特殊方法。Getter用于获取属性的值,而Setter用于设置属性的值。它们允许你在属性访问过程中添加额外的逻辑,例如验证输入、计算属性或记录属性访问。在你提供的示例中,你展示了如何在Dart编程语言中定义Getter和Setter。

    首先,让我们来看看Getter的示例:

    class MyClass {
      int _aProperty = 0;
    
      // Getter for aProperty
      int get aProperty => _aProperty;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在上述示例中,我们创建了一个名为_aProperty的私有属性,并定义了一个名为aProperty的Getter。Getter的定义方式是在属性名称前面添加get关键字,后跟Getter的名称。在Getter内部,我们简单地返回了_aProperty的值。这允许外部代码通过myInstance.aProperty来访问_aProperty的值,就像访问普通属性一样,但实际上是通过Getter方法。

    接下来,让我们来看看Setter的示例:

    class MyClass {
      int _aProperty = 0;
    
      // Setter for aProperty
      set aProperty(int value) {
        if (value >= 0) {
          _aProperty = value;
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这个示例中,我们定义了一个名为aProperty的Setter。Setter的定义方式是在属性名称前面添加set关键字,后跟Setter的名称。在Setter内部,我们可以添加额外的逻辑以控制属性的赋值。在这里,我们检查传入的值是否大于等于0,如果是,则将其赋值给_aProperty。这意味着外部代码可以通过myInstance.aProperty = newValue来设置_aProperty的值,但Setter允许我们在赋值时添加验证或其他逻辑。

    总结一下,Getter和Setter是用于控制属性访问的特殊方法,允许你在获取和设置属性值时添加额外的逻辑。Getter用于获取属性的值,Setter用于设置属性的值。这些机制有助于封装属性并确保属性值的合法性。在示例中,你展示了如何在Dart中定义Getter和Setter,但这些概念在许多其他面向对象编程语言中也是通用的。

    练习

    想象你有一个购物车类,其中有一个私有的 List 类型的 prices 属性。添加以下内容:

    一个名为 total 的 getter,用于返回总价格。

    只要新列表不包含任何负价格, setter 就会用新的列表替换列表(在这种情况下,setter 应该抛出 InvalidPriceException)。

    答案:

    class InvalidPriceException {}
    
    class ShoppingCart {
      List _prices = [];
      
      double get total => _prices.fold(0, (e, t) => e + t);
      
      set prices(List value) {
        if (value.any((p) => p < 0)) {
          throw InvalidPriceException();
        }
        
        _prices = value;
      }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 相关阅读:
    基于dlib库关键点检测(图片和视频)demo
    git管理常用命令
    css:grid布局子元素被撑开导致没有按比例均分
    目标检测YOLO实战应用案例100讲-基于YOLOv5的航拍图像旋转目标检测
    [附源码]java毕业设计医学季节性疾病筛查系统
    个人设计web前端大作业 基于html5制作美食菜谱网页设计作业代码
    百万奖池角逐,华为云IoT边缘带你看懂“边缘计算开发者大赛”
    【附代码】使用Shapely计算点面关系
    【附源码】计算机毕业设计JAVA互联网保险网站
    Golang goroutine 进程、线程、并发、并行
  • 原文地址:https://blog.csdn.net/wniuniu_/article/details/132858439