12. Dart中的对象类
面向对象编程(OOP)的三个基本特征是:封装、继承、多态
- 封装:封装是对象和类概念的主要特性。封装,把客观事物封装成抽象的类,并且把自己的部分属性和方法提供给其他对象调用,而一部分属性和方法则隐藏。
- 继承:面向对象编程(OOP)语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
- 多态:允许将子类类型的指针赋值给父类类型的指针,同一个函数调用会有不同的执行效果。
Dart 所有的东西都是对象,所有的对象都继承自 Object 类。
Dart 是一门使用类和单继承的面向对象语言,所有的对象都是类的实例,并且所有的类都是 Object 的子类
一个类通常由属性和方法组成。
一、类的声明与使用
1、声明一个 Person 类
class Person { // 类属性声明 String name = "张三"; int age = 23; //方法声明 void getInfo() { //两种方式获取类属性 // print("$name----$age"); //第一种 print("${this.name}----${this.age}"); // 第二种 } //修改类属性 void setInfo(int age) { this.age = age; } }
2、实例化 Person 类
void main() { //实例化 var p1=new Person(); print(p1.name); p1.getInfo(); }
实例化类的时候,也可以指定当前实例的类型,比如以前我们定义 list 的时候,可以这样写var list = new List();
,然后通过 list.add()为集合里增加数据,我们这里在定义 list 的时候也可以为它指定List
类型。同样我们实例化 Person 类的时候,也可以为它指定Person
类型,如下代码:
void main() { //实例化 Person p1 = new Person(); // print(p1.name); p1.setInfo(28); p1.getInfo(); }
3、默认构造函数
class Person{ String name; int age; //默认构造函数 Person(String name,int age){ this.name=name; this.age=age; } void printInfo(){ print("${this.name}----${this.age}"); } }
默认构造函数的简写:
class Person{ String name; int age; //默认构造函数的简写 Person(this.name,this.age); void printInfo(){ print("${this.name}----${this.age}"); } }
使用命名构造函数
void main() { Person p1=new Person('张三',20); p1.printInfo(); Person p2=new Person('李四',25); p2.printInfo(); }
4、自定义类命名构造函数
命名构造函数允许多个不同名称构造函数的存在,调用不同名称的构造函数,可以实例化出不同的实例。
class Person { String name; int age; //默认构造函数的简写 Person(this.name, this.age); Person.now() { print('我是命名构造函数'); } Person.setInfo(String name, int age) { this.name = name; this.age = age; } void printInfo() { print("${this.name}----${this.age}"); } }
使用命名构造函数:
void main() { //实例化 DateTime 调用它的命名构造函数 // var d=new DateTime.now(); // print(d); //默认实例化类的时候调用的是 默认构造函数 //Person p1=new Person('张三', 20); //命名构造函数 //Person p1=new Person.now(); Person p1=new Person.setInfo('李四',30); p1.printInfo(); }
5、Dart 中单独把类抽成一个模块
在 lib/Person.dart
声明了一个 Person class:
class Person { // 类属性声明 String name; int age; int sex; // 普通构造函数 Person(String name, int age, [int sex = 1]) { this.name = name; this.age = age; this.sex = sex; } // 方法声明 void getInfo() { print( 'My name is ${name}, my age is ${age}, and I am a ${sex == 1 ? 'man' : 'woman'}'); } // 修改类属性 void changeName(String name) { if (name != null) { this.name = name; } } }
上面的类已经声明结束了,属性、方法和构造函数都有。
类的引入
在要使用的 dart 文件中引入 Person 类:
import 'lib/Person.dart';
实例化 Person 类
Person p = new Person('mybj', 20, 0); p.getInfo(); p.changeName('码云笔记'); p.getInfo();
6、私有属性及私有方法
Dart 和其他面向对象语言不一样,Data 中没有 public、private、protected 这些访问修饰符合,但是我们可以使用下划线_
把一个属性或者方法定义成私有。
注:私有属性和方法 只有放在单独的文件 class 中生效
class Animal{ String _name; //私有属性 int age; //默认构造函数的简写 Animal(this._name,this.age); void printInfo(){ print("${this._name}----${this.age}"); } String getName(){ return this._name; } void _run(){ print('这是一个私有方法'); } execRun(){ this._run(); //类里面方法的相互调用 } }
访问私有属性和方法:
import 'lib/Animal.dart'; void main() { Animal a = new Animal('小狗', 3); print(a.getName()); a.execRun(); //间接的调用私有方法 }
7、Dart 类中的 getter 和 setter 修饰符的用法
getter 和 setter 可以最大程度的简化值得获取或者格式化以及设置。
class Rect{ num height; num width; Rect(this.height,this.width); get area{ return this.height*this.width; } set areaHeight(value){ this.height=value; } }
使用 getter
和 setter
void main(){ Rect r=new Rect(10,4); // print("面积:${r.area()}"); r.areaHeight=6; print(r.area); }
8、初始化构造列表
Dart 中我们也可以在构造函数体运行之前初始化实例变量,不过单 class 上没有实际意义。
class Rect{ int height; int width; Rect():height=2,width=10{ print("${this.height}---${this.width}"); } getArea(){ return this.height*this.width; } } //使用 void main(){ Rect r=new Rect(); print(r.getArea()); }
码云笔记 » 12. Dart中的对象类