如需转载,请注明出处:Flutter学习笔记(8)--Dart面向对象
Dart作为高级语言,支持面向对象的很多特性,并且支持基于mixin的继承方式,基于mixin的继承方式是指:一个类可以继承自多个父类,相当于其他语言里的多继承。所有的类都有同一个基类Object,这和特性类似于Java语言,Java所有的类也都是继承自Object,也就是说一切皆对象。
//实例化了一个User类的对象user var user = new User('张三',20);
-
实例化成员变量
Class User{ String name;//name 成员变量 int age;//age 成员变量 }
类定义中所有的变量都会隐式的定义setter方法,针对非空的变量会额外增加getter方法。实例化成员变量请参考如下代码:
main(){ var user = new User(); user.name = '张三';//相当于使用了name的setter方法 user.age = 25; }
-
构造函数
1.常规的构造函数
构造函数是用来构造当前类的函数,是一种特殊的函数,函数名称必须要和类名相同才行,如下代码为User类添加了一个构造函数,函数里给User类的两个成员变量初始化了值:
Class User{ String name; int age; User(String mName,int mAge){ this.name = mAge; this.age = mAge; } }
this关键字指向了当前类的实例,上面的代码可以简化为:
Class User{ String name; int age; User(this.name,this.age); }
第一种没有简化的构造方法初始化成员变量是在方法体内进行初始化的,第二种简化的构造方法初始化成员变量,是在实例化类的时候直接进行赋值初始化的。
2.命名的构造函数
使用命名构造函数从另一类或现有的数据中快速实现构造函数,代码如下所示:
Class User{ String name; int age; //普通构造函数 User(this.name,this.age); //命名构造函数 User.fromJson(Map json){ name = json['name']; age = json['age']; } } //在实例化类的时候,如果没有传参,会默认调用无参数的构造方法 //普通构造函数 var user = new User('张三',25); //命名构造函数 var user = new User.fromJson(mMapJson);
我对命名构造函数的理解就是起了个名字,在Java里面,相同参数个数的构造方法只能有一个,在Dart里面也不例外,那么如果我们想有多个相同参数个数的构造方法要怎么做呢,这时候命名构造方法就显现出他价值了,我们可以给相同参数个数的构造方法起不同的名字,这种就不会有错误了。
3.子类的创建
注1:子类在继承父类的时候,如果在父类中有显示的提供一个无名、无参的构造函数,不会继承父类无名有参构造函数和命名构造函数,即:子类只会继承父类无名无参的构造函数。(程序会给类隐式的生成一个无名、无参的构造函数)
注2:子类在继承父类的时候,如果在父类中没有有显示的提供一个无名、无参的构造函数,子类必须手动调用父类的一个构造函数,在这种情况下,调用的父类的构造函数要放在子类构造函数之后,在子类构造函数体之前,用“:”分隔。
注3:父类的构造函数会在子类的构造函数前调用。
注4:默认情况下,子类只能调用父类无名、无参数的构造函数。
下面我会用代码给大家解释上面的“注”(开始我也不会,也是上网查资料理解的!!!)
注1和注3:父类中有一个无名、无参的构造函数,子类继承父类,会默认继承父类无名、无参的构造函数(即使有其他无名、有参的构造函数或者命名构造函数,子类都不会调用),并且,父类的无名、无参的构造函数会在子类的构造函数之前被调用。
Class Futher { //无名、无参的构造函数 Futher(){ print('我是父类无名、无参的构造函数'); } } Class Son extends Futher { //因为父类有显式的声明一个无名、无参的构造函数,所以不用手动调用父类的构造函数。 Son.fromJson(Map mMapJson){ print('我是子类的命名构造函数'); } } var son = new Son.fromJson(mMapJson); //打印结果 //我是父类无名、无参的构造函数 //我是子类的命名构造函
注2:下面代码里,子类的命名构造方法写了两种方式,第一种是正确的,第二种是错误的,有详细的注释, 如果有疑问请留言。
Class Futher { //无名、无参的构造函数 Futher.printSth(){ print('我是父类无名、无参的构造函数'); } } Class Son extends Futher { //因为父类没有有显式的声明一个无名、无参的构造函数,所以需要手动的调用父类的构造函数。 Son.fromJson(Map mMapJson) : super Futher.printSth{ print('我是子类的命名构造函数'); } //这种写法会报错,因为父类中没有显示的提供一个无名、无参的构造函数。所以需要像上面那样,手动调用父类的一个构造函数 Son.fromJson(Map mMapJson){ print('我是子类的命名构造函数'); } }
4.构造函数初始化列表
上面在讲解常规的构造函数和命名构造函数的时候,示例代码都有对类中的成员变量进行了初始化,特点是在构造函数的方法体内进行初始化,初始化成员变量还有另一种方式,就是在构造函数运行前来初始化成员变量。
Class User { String name; int age; User(mName,mAge) :name = mName, age = mAge{ // Do Some Thing } }
特点是在构造函数的方法体前(大括号前面)来初始化成员变量,变量间用“,”分隔。
-
读取和写入对象
get()和set()方法是专门用于读取和写入对象的属性的方法,每一个类的实例,系统都会隐式的包含有get()和set()方法。
例如,定义一个矩形的类,有上、下、左、右:top、bottom、left、right四个成员变量,使用get及set关键字分别对right、bottom进行获取和设置值。代码如下所示:
Class Rectangle { num left; num top; num width; num height; Rectangle(this.left,this.top,this.width,this.height); num get right => left + width;//获取righht的值(第一行) set right(num value) => l