赞
踩
- //java中写法
- class P {
- double x;
- double y;
-
- P(int x, int y) {
- this.x = x;
- this.y = y;
- }
- }
-
- //dart建议写法
- class P {
- num x;
- num y;
- Point(this.x, this.y);
- }
- class P {
- num x;
- num y;
-
- Point(this.x, this.y);
-
- //重定向构造函数,使用冒号调用其他构造函数
- P.alongXAxis(num x) : this(x, 0);
- }
- class Rect{
- int _height;//定义成私有成员(前面加下划线),私有成员不能被外部直接访问
- int _width;
-
- Rect(this._height,this._width);//Dart默认构造函数 只能声明一次,Java可以声明多个
- Rect.heigthSet(this._height);//命名构造函数 可以声明多个
- Rect.widthSet(this._width);//命名构造函数 可以声明多个
- Rect.allSet(this._width,this._height);//命名构造函数 可以声明多个
- Rect.allSet2():_height=5,_width=5;//带默认参数的构造方法
-
- //set get属性方法,外部通过访问属性的形式调用该方法
- set setHeight(int value){
- this._height=value;
- }
-
- //getter属性方法,不用括号,外部通过访问属性的形式调用该方法
- get getHeight{
- return _height;
- }
-
- //getter属性方法,不用括号,外部通过访问属性的形式调用该方法
- get Area{
- return _height*_width;
- }
-
- //定义私有方法
- int _area(){
- return _height*_width;
- }
-
- int getArea(){
- return _area();
- }
-
- String getMessage(){
- return('获取传入的高,宽值:$_height $_width 面积计算为:');
- }
- }
- class Rectangle {
- num left;
- num top;
- num width;
- num height;
- Rectangle(this.left, this.top, this.width, this.height);
- num get right => left + width;
- set right(num value) => left = value - width;
- num get bottom => top + height;
- set bottom(num value) => top = value - height;
- }
实例
- // 定义父类
- abstract class Person{
- String name;
- int age;
-
- Person(this.name, this.age);
-
- Person.second(this.name, this.age);
-
- void show() {
- print('$name $age');
- }
-
- //抽象方法定义规则,要求子类必须继承
- void marry();
- }
-
- // 子类继承,必须实现抽象方法
- class Boy extends Person{
- double height;
- Boy(String name, int age,double height):super(name,age){
- this.height=height;
- }
-
- //方法重写
- @override
- void show(){
- // super.show();
- print('$name $age $height');
- }
-
- void playBoy(){
- print('男生喜欢打王者荣耀');
- }
-
- @override
- void marry() {
- print('我是一个男生,要找一个女朋友结婚');
- }
-
- }
1、Dart中的多态体现在方法重写,向上转型
2、比如上面Boy子类中的方法重写,我们也可以再定义一个Girl子类重写;
3、向上转型,向下转型这里做一个简单的介绍,具体代码可在我的资源中下载去看
4、向上转型可以提取公共方法,向下转型可以转化到子类,调用子类方法,向上转型也是一种封装
A is B 判断A是否是B类型
A as B 把A类型转换为B类型
- if(p is Boy){
- Boy boy=p as Boy;
- boy.playBoy();
- }
dart中类就是接口,和声明抽象类一样,一般是用abstract修饰
代码
- abstract class Person {
- void run();
- }
- class Student implements Person {
- @override
- void run() {
- print("run 执行了。。。")
- }
- }
实际上就是多继承
通过mixins实现类似多继承,但是mixins不属于继承,也不属于接口,就是一种新的特性
作为mixins的类只能继承于最终父类Object,不可以继承别的类
mixins类不能有构造函数
一个类可以继承于多个mixins
Mixins是Dart里面的一个全新概念,简单来说,用来复用多个类之间的代码,减少耦合,换句话来说,可以从中扩展方法(或变量)而不扩展类
工程师 = 软件工程师 + 建筑工程师
教师 = 美术教师 + IT教师
工作者 = 教师 + 工程师
- //工作者
- abstract class Worker {
- public abstract void doWork();//工作者需要工作
- }
-
- //工程师
- class Engineer extends Worker {
- @Override
- public void doWork() {
- System.out.println("工程师在工作");
- }
- }
-
- //教师
- class Teacher extends Worker {
- @Override
- public void doWork() {
- System.out.println("教师在教学");
- }
- }
-
- //软件工程师
- class SoftwareEngineer extends Engineer {}
-
- //建筑工程师
- class BuildingEngineer extends Engineer {}
-
- //美术教师
- class ArtTeacher extends Teacher {}
-
- //IT教师
- class ITTeacher extends Teacher {}
- //工作者
- abstract class Worker {
- void doWork();//工作者需要工作
- }
-
- //工程师
- class Engineer extends Worker {
- void doWork() {
- print('工程师在工作');
- }
- }
-
- //教师
- class Teacher extends Worker {
- void doWork() {
- print('教师在教学');
- }
- }
-
- //软件工程师
- class SoftwareEngineer extends Engineer {}
-
- //建筑工程师
- class BuildingEngineer extends Engineer {}
-
- //美术教师
- class ArtTeacher extends Teacher {}
-
- //IT教师
- class ITTeacher extends Teacher {}
- interface CanFixComputer {
- void fixComputer();
- }
-
- interface CanDesignSoftware {
- void designSoftware();
- }
-
- //软件工程师
- class SoftwareEngineer extends Engineer implements CanFixComputer, CanDesignSoftware {
-
- @Override
- public void fixComputer() {
- System.out.println("修电脑");
- }
-
- @Override
- public void designSoftware() {
- System.out.println("设计软件");
- }
-
- }
-
- //IT教师
- class ITTeacher extends Teacher implements CanFixComputer {
-
- @Override
- public void fixComputer() {
- System.out.println("修电脑");
- }
-
- }
但是,我们知道Dart当中没有interface的概念,但并不意味着这门语言没有接口,事实上,Dart任何一个类都是接口,你可以实现任何一个类,只需要重写那个类里面的所有具体方法。
如果要用Dart来实现的话,只需要将interface修改成abstract class。
但是我们发现,fixComputer这个接口被继承了两次,并且两次的实现都是一样的,这里就出现了代码重复和冗余的问题。怎么办呢?在java中我们有接口的default实现来解决这个问题(这是一个java8出现的不得已的方案。)
但是,有了mixins之后,这件事就变得不那么难了。
- abstract class CanFixComputer {
- void fixComputer() {
- print('修电脑');
- }
- }
-
- abstract class CanDesignSoftware {
- void designSoftware() {
- print('设计软件');
- }
- }
-
- //软件工程师
- class SoftwareEngineer extends Engineer
- with CanFixComputer, CanDesignSoftware {}
-
- //IT教师
- class ITTeacher extends Teacher with CanFixComputer {}
-
- main() {
- ITTeacher itTeacher = new ITTeacher();
- itTeacher.doWork();
- itTeacher.fixComputer();
- SoftwareEngineer softwareEngineer = new SoftwareEngineer();
- softwareEngineer.doWork();
- softwareEngineer.fixComputer();
- softwareEngineer.designSoftware();
- }
通过以上代码,我们可以看到这里不用implements,更不是extends,而是with。
每个具有某项特性的类不再需要具体去实现同样的功能,接口是没法实现功能的,而通过继承的方式虽然能实现功能,但已经有父类,同时不是一个父类,又不能多继承,所以这个时候,Dart的Mixin机制就比Java的接口会高效,开发上层的只需要关心当前需要什么特性,而开发功能模块的关心具体要实现什么功能。
- class First {
- void doPrint() {
- print('First');
- }
- }
-
- class Second {
- void doPrint() {
- print('Second');
- }
- }
-
- class Father {
- void doPrint() {
- print('Father');
- }
- }
-
- class Son1 extends Father with First,Second { }
-
- class Son2 extends Father with First implements Second {
- main() {
- Son1 son1 = new Son1();
- son1.doPrint(); // Second
- Son2 son2 = new Son2();
- son2.doPrint(); // First
- }
- }
其实在Son2中implements只是说要实现他的doPrint()方法,这个时候其实具体实现是First中Mixin的具体实现。
而Mixin的具体顺序也是可以从代码倒过来看的,最后mixin的优先级是最高的。
优先级 with>extends>implements
在Dart当中,有很多容器对象,在创建对象时都可以定义泛型类型,这一点和Java是一样。
Java中的泛型信息是编译时的,泛型信息在运行时是不存在的。
Dart的泛型类型是固化的,在运行时也有可以判断的具体类型。
- var list = List<String>();
- list.add('aaa');
- list.add('bbb');
- list.add('ccc');
- print(list);
- var map = Map<int, String>();
- map[1] = 'aaaa';
- map[2] = 'bbbb';
- map[3] = 'cccc';
- print(map);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。