美文网首页
Dart的构造方法及属性(setter/getter)

Dart的构造方法及属性(setter/getter)

作者: 见字如晤一 | 来源:发表于2022-02-14 10:29 被阅读0次

面向对象编程(OOP)的三个基本特征是:封装、继承、多态

封装:封装是对象和类概念的主要特性。封装,把客观事物封装成抽象的类,并且把自己的部分属性和方法提供给其他对象调用, 而一部分属性和方法则隐藏。
   
继承:面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
     
多态:允许将子类类型的指针赋值给父类类型的指针, 同一个函数调用会有不同的执行效果 。

Dart所有的东西都是对象,所有的对象都继承自Object类。

Dart是一门使用类和单继承的面向对象语言,所有的对象都是类的实例,并且所有的类都是Object的子类

一个类通常由属性和方法组成。

示例代码如下:
创建Rect.dart类在lib文件下,类路径为:lib/Rect.dart

class Rect {
  //直接定义属性时,若不加late会提示没有初始化,有点像kotlin语言
  late int height;
  //下划线开头被认为是私有属性,在main方法中调用时,不能直接被访问。
 //私有属性满足达到效果需要满足两个条件:1、私有属性的类单独存在于一个类中
 //2、下划线开头
  late int _width;

  //Dart语言定义构造函数,
  // 若已经定义一个构造函数后,不能再次定义同名的构造函数
  Rect(int w, int h) {
    this._width = w;
    this.height = h;
  }

  //因为上面已经定义过了,再定义会报错
  // Rect() {}

  //次构造函数是被称为命名构造函数,写法如下
  Rect.init(int w, int h) {
    this._width = w;
    this.height = h;
  }

  //类中的getter写法:get放在方法名前面,方法名后面不跟()
  get area {
    return this.height * this._width;
  }

  //自定义函数写法
  int getArea() {
    return this.height * this._width;
  }

  //类中的setter写法:set放方法名前面,注意这里的方法名,不能和属性名一模一样,我也不知道为什么。
  set areawidth(int w) {
    this._width = w;
  }
  //自定义设置属性width
  void setAreaWidth(int w) {
    this._width = w;
  }
}

main方法调用:
注意这里import导入了Rect.dart类

import 'lib/Rect.dart';

void main() {
  Rect rect = new Rect(10, 20);
  int area = rect.getArea();
  print(area);

  rect.setAreaWidth(4);
  area = rect.getArea();
  print(area);
  //1、定义的类单独存在于一个类文件中  2、以下划线开头被认为是私有属性
  // print(rect._with);
}

打印结果:

200
80

构造方法:
在java中,我们总会提到构造函数(方法),new一个对象时,可以使用不通的构造方法实现,并且构造方法名字必须同类名一致,参数可以不同,注意:这里我说的都是java中的方式,在dart语言中,这个规则有变化。1、同类名一致的构造方法只能有一个,参数不定 2、若要重载构造方法,需要通过 类名.构造方法名 来实现次构造方法。如上诉Rect类中,主构造方法为Rect(int w, int h),次构造方法为:Rect.init(int w, int h),且主构造方法和次构造方法没有关系,没有java语言中的super调用主构造方法的说法

下面列举几个情况进行构造方法的说明:
1、不明确定义构造方法时,有默认不带任何参数的构造方法
lib/Rect.dart

class Rect {
  //直接定义属性时,若不加late会提示没有初始化,有点像kotlin语言
  late int height;
  late int width;

  //类中的getter写法:get放在方法名前面,方法名后面不跟()
  get area {
    return this.height * this.width;
  }
}

使用类Rect.dart

import 'lib/Rect.dart';

void main() {
  Rect rect = new Rect();
  rect.width = 4;
  rect.height = 5;
  int area = rect.area;
  print(area);
}

构造方法初始化列表

class Rect {
  //定义属性,不加late会提示没有初始化,但是这里定义了构造方法初始化列表,可以不加late,不会报错
  int height;
  int width;
  //
  Rect():width=10,height=2{
  }
  //类中的getter写法:get放在方法名前面,方法名后面不跟()
  get area {
    return this.height * this.width;
  }
}

main方法中直接调用运行,不用设置值,因为初始化列表已经赋值了

import 'lib/Rect.dart';

void main() {
  Rect rect = new Rect();
  int area = rect.area;
  print(area);
}
1.png

图片可能显示不了,定义属性不实用late关键字时,同时去掉构造方法的初始化列表,会报错,报错代码如下:

class Rect {
  //定义属性,不加late会提示没有初始化,但是这里定义了构造方法初始化列表,可以不加late,不会报错
  int height;
  int width;
  //若没有初始化列表,Rect会报错
  //提示:Non-nullable instance field 'height' must be initialized
  Rect(){
  }
  //类中的getter写法:get放在方法名前面,方法名后面不跟()
  get area {
    return this.height * this.width;
  }
}

相关文章

  • Dart的构造方法及属性(setter/getter)

    面向对象编程(OOP)的三个基本特征是:封装、继承、多态 Dart所有的东西都是对象,所有的对象都继承自Objec...

  • 5 spring5中使用Junit

    实例演练 定义User类,封装account和password属性,提供getter/setter,重载构造方法,...

  • Python基础(10)——属性

    属性定义 直接在类里定义 构造函数定义 私有属性 私有属性添加getter和setter方法 使用property...

  • JavaScript对象(二)

    属性的getter和setter JavaScript的属性值可以用getter和setter方法代替,由gett...

  • python类相关装饰器小记

    @property:针对属性的getter方法@age.setter:针对属性的setter方法 __ slots...

  • Kotlin面向对象之访问修饰符(Visibility Modi

    类,对象,接口,构造函数,函数,属性及其setter方法可以被可见性修饰符修饰。(Getter方法总是具有与属性相...

  • 关于OC的属性修饰词

    读写属性:setter:指定生成setter方法的名字。getter:指定生成getter方法的名字,例如@pro...

  • Java bean

    1、所有属性为private 2、提供默认构造方法 3、提供getter和setter 4、实现serializa...

  • atomic和noatomic

    atomic 用于保证属性的getter setter方法的原子属性操作,相当于在getter和setter内部增...

  • 属性函数---setter/getter

    属性函数同样可以使用setter/getter设置读写方法。 setter函数定义设置属性的值。getter函数定...

网友评论

      本文标题:Dart的构造方法及属性(setter/getter)

      本文链接:https://www.haomeiwen.com/subject/cqfzkrtx.html