Dart学习笔记-面向对象编程
Posted 追到梦的魔术师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dart学习笔记-面向对象编程相关的知识,希望对你有一定的参考价值。
一、类与对象,声明、创建及基本特征
1、声明与创建
- 类与对象
- 使用关键字class声明类
- 使用关键字new创建对象,new可省了
var person = Person();
2、Dart 类的特性
- 属性默认生成getter和setter方法
- 使用final声明的属性只有getter方法
- 属性和方法通过.访问
- 方法不能被重载
class Person
String name;
int age;
void work()
print("Name is $name,Age is $age,He is working...");
var person = Person();
person.age = 12;
person.name = "tom";
print(person.age);
person.work();
3、计算属性
- 顾名思义,计算属性的值是通过计算而来,本身并不存储值
- 计算属性的赋值,其实是通过计算转换到其他的实例变量
class Rectangle
num width,height;
num get area => width * height;
var rect = Rectangle();
rect.height = 20;
rect.width = 10;
print(rect.area);//200
二、构造方法及初始化列表
1、构造方法
- 如果没有自定义构造方法,则会有个默认构造方法
- 如果存在自定义构造方法,则默认构造方法无效
- 构造方法不能重载
class Boy
String name;
int age;
Boy(String name, int age)
this.name = name;
this.age = age;
print("Name is $name,Age is $age");
void work()
print("Name is $name,Age is $age,He is working...");
若存在final属性:
class Boy
String name;
int age;
inal String gender;
Boy(String name, int age,this.gender)
this.name = name;
this.age = age;
print("Name is $name,Age is $age");
void work()
print("Name is $name,Age is $age,He is working...");
此时属性赋值在构造函数之前执行
构造方法语法糖:
Boy(this.name,this.age,this.gender);
同理属性赋值在构造函数之前执行
命名构造方法:
由于构造方法无法重载,要想给部分属性赋值时,可以采用赋值构造方法
class Boy
String name;
int age;
inal String gender;
Boy(String name, int age,this.gender)
this.name = name;
this.age = age;
print("Name is $name,Age is $age");
Boy.withGender(this.gender);
void work()
print("Name is $name,Age is $age,He is working...");
var boy = Boy.withGender("男");
boy.work();
常量构造方法:
- 如果类是不可变状态,可以把对象定义为编译时常量
- 使用const声明构造方法,并且所有变量都为final
- 使用const声明对象,可以省略
class Dog
final String name;
final int age;
const Dog(this.name,this.age);
工厂构造方法:
- 工厂构造方法类似于设计模式中的工厂模式
- 在构造方法钱添加关键字factory实现一个工厂构造方法
- 在工厂构造方法中可返回对象
class Factory
String message;
factory Factory(String message)
//message为dart时,实例化,否则返回空
if(message == "dart")
return Factory.internal(message);
else
return null;
Factory.internal(this.message);
var factory = Factory("Java");
print(factory == null);//true
2、初始化列表
用于解决构造方法传入集合时,final变量的赋值问题
- 初始化列表会在构造方法体执行之前执行
- 使用逗号分隔初始化表达式
- 初始化列表常用于设置final变量的值
class Girle
String name;
int age;
final String gender;
Girle.withMap(Map map) : gender = map["gender"]
this.name = map["name"];
this.age = map["age"];
void work()
print("Name is $name,Age is $age,Gender is $gender,She is working...");
var map = "name":"tom","age":12,"gender":"女";
var girle = Girle.withMap(map);
girle.work();
三、静态成员及对象操作符的使用
1、静态成员
- 使用static关键字来实现类级别的变量和函数
- 静态成员不能方位非静态成员,非静态成员可以访问静态成员
- 类中的常量需要使用static const声明
class Page
static const int maxPage = 10;
static int currentPage = 1;
static void up()
currentPage++;
print("currentPage = $currentPage");
static void down()
currentPage--;
print("currentPage = $currentPage");
Page.up();//currentPage = 2
Page.down();//currentPage = 1
2、对象操作符
条件成员访问:?.
相当于在执行之前进行判空操作,如果为null则不再执行
var person;
person?.age = 12;
此时如果不适用?.则会crash
类型转换:as
person = "";
person = Person();
(person as Person).age = 12;
是否指定类型:"is & is! "用于判断对象的class
if(person is Person)
person.age = 12;
级联操作
person..name = "小李"
..age = 26
..work();
四、对象call方法
如果类实现了call()方法,则该类的对象化可以作为方法使用
class Animal
String call(name,age)=>"Name is $name, age is $age";
var animal = Animal();
print(animal("小猫",1));//Name is 小猫, age is 1
以上是关于Dart学习笔记-面向对象编程的主要内容,如果未能解决你的问题,请参考以下文章