构造函数
Dart中的构造函数可以省略方法体
java
class Student{
public String name;
public int age;
Student(String name,int age){
this.name = name;
this.age = age;
}
}
Dart
class Student{
String name;
int age;
Student(this.name,this.age);
}
Dart中的命名构造函数
class Student{
String name = "";
//命名构造函数 (可以设置多个,名称自定义,参数自定义)
Studen.build(String name){
this.name = name;
}
}
Dart中可以在实例化之前为变量设置属性值
先执行属性赋值,再执行构造方法
class Student {
String name = "";
int age = 2;
//实例化之前为变量设置属性值
Student():name = "悟空",age = 20;
}
自定义类型
- Dart中可以为函数定义类型, 在声明函数类型参数时,只需声明此类型,便可规定为传递此函数
定义
将 返回值为 Widget 的一个函数,定义为 myType类型
typedef myType = Widget Function(BuildContext context);
使用
//定义了一个getName方法,接收的参数类型为myType,则外部在调用时,需出入一个与声明格式相同的函数
void getName(myType type){
//回调传入的声明函数,此时的type可以理解为方法名称
type(context);
}
私有属性/方法
java
通过private关键字
private String name;
private void showInfo(){
}
Dart
直接在 属性/方法 名称前加下划线
String _name;
void _showInfo(){
}
Dart 类中的set和get方法
class Student {
String name = "";
int age = 2;
Student(this.name, this.age);
//get方法
get studentInfo {
return "学生的信息, 姓名: $name 年龄: $age";
}
//set方法
set studentName(value) {
this.name = value;
}
}
//使用
void main() {
Student student = new Student("小明", 30);
print("${student.studentInfo}");
student.studentName = "小花";
print("${student.studentInfo}");
}
Dart中的级联操作
如果频繁操作了一个对象,可使用如下调用吗
void main() {
Student student = new Student();
//级联操作,简化代码
student..name = "八戒"
..age = 900
..studentInfo;
}
Dart中的接口
- dart中没有interface关键字,一般使用抽象类来定义接口 , 同样使用implements关键字来实现
- 由于抽象类中可以定义属性,所以实现接口后,属性也需要实现.
Dart中的 mixins
mixins类可模拟多继承, 但是在使用时存在一定的局限性
- 作为mixins的类智能继承自Object,不能继承其他类
- 作为mixins的类不能有构造函数
- 一个类可以 mixins 多个 mixins类
- mixins不是继承,也不是接口实现, 它可以和继承与接口同时存在
- 如果继承和 mixins类中存在同样的方法,则依照顺序,后者覆盖前者
示例如下
class Person{
String str = "普通类文本";
}
class A {
String name = "a";
printA(){
print("类名 $name");
}
void run(){
print("run A");
}
}
class B {
String name = "b";
printB(){
print("类名 $name");
}
void run(){
print("run B");
}
}
/*
* 此处 with后方的A和B便是mixins类,他们不能存在构造方法,不能有继承的父类
* 继承和mixins可同时存在
* */
class C extends Person with A,B{}
void main() {
C c = new C();
c.printA();
//由于存在相同的name属性,且B类在后,所以B类的name会覆盖A类的name
c.printB();
//同上,B类的run()覆盖了前面的
c.run();
}