当前位置:   article > 正文

【Flutter入门到进阶】Dart基础篇---面向对象_dart面向对象

dart面向对象

1 类

1.1 构造

  1. //java中写法
  2. class P {
  3.   double x;
  4.   double y;
  5.   P(int x, int y) {
  6.     this.x = x;
  7.     this.y = y;
  8.   }
  9. }
  10. //dart建议写法
  11. class P {
  12.   num x;
  13.   num y;
  14.   Point(this.x, this.y);
  15. }

1.2 重定向构造

  1. class P 
  2.   num x; 
  3.   num y; 
  4.   Point(this.x, this.y); 
  5.   //重定向构造函数,使用冒号调用其他构造函数
  6.   P.alongXAxis(num x) : this(x, 0);
  7. }

1.3 命名构造函数

  1. class Rect{
  2.   int _height;//定义成私有成员(前面加下划线),私有成员不能被外部直接访问
  3.   int _width;
  4.  
  5.   Rect(this._height,this._width);//Dart默认构造函数 只能声明一次,Java可以声明多个
  6.   Rect.heigthSet(this._height);//命名构造函数 可以声明多个
  7.   Rect.widthSet(this._width);//命名构造函数 可以声明多个
  8.   Rect.allSet(this._width,this._height);//命名构造函数 可以声明多个
  9.   Rect.allSet2():_height=5,_width=5;//带默认参数的构造方法
  10.   
  11.   //set get属性方法,外部通过访问属性的形式调用该方法
  12.   set setHeight(int value){
  13.     this._height=value;
  14.   }
  15.  
  16.   //getter属性方法,不用括号,外部通过访问属性的形式调用该方法
  17.   get getHeight{
  18.     return _height;
  19.   }
  20.  
  21.   //getter属性方法,不用括号,外部通过访问属性的形式调用该方法
  22.   get Area{
  23.     return _height*_width;
  24.   }
  25.  
  26.   //定义私有方法
  27.   int _area(){
  28.     return _height*_width;
  29.   }
  30.  
  31.   int getArea(){
  32.     return _area();
  33.   }
  34.  
  35.   String getMessage(){
  36.     return('获取传入的高,宽值:$_height $_width 面积计算为:');
  37.   }
  38. }

1.4 类的Get和Set方法

  1. class Rectangle {   
  2. num left;   
  3. num top;   
  4. num width;   
  5. num height;   
  6. Rectangle(this.left, this.top, this.width, this.height);   
  7. num get right => left + width;
  8. set right(num value) => left = value - width;   
  9. num get bottom => top + height;   
  10. set bottom(num value) => top = value - height;
  11. }

2 抽象 和 继承

实例

  1. // 定义父类
  2. abstract class Person{
  3.   String name;
  4.   int age;
  5.  
  6.   Person(this.name, this.age);
  7.  
  8.   Person.second(this.name, this.age);
  9.  
  10.   void show() {
  11.     print('$name $age');
  12.   }
  13.  
  14.   //抽象方法定义规则,要求子类必须继承
  15.   void marry();
  16. }
  17. // 子类继承,必须实现抽象方法
  18. class Boy extends Person{
  19.   double height;
  20.   Boy(String name, int age,double height):super(name,age){
  21.     this.height=height;
  22.   }
  23.  
  24.   //方法重写
  25.   @override
  26.   void show(){
  27.     // super.show();
  28.     print('$name $age $height');
  29.   }
  30.  
  31.   void playBoy(){
  32.     print('男生喜欢打王者荣耀');
  33.   }
  34.  
  35.   @override
  36.   void marry() {
  37.     print('我是一个男生,要找一个女朋友结婚');
  38.   }
  39.  
  40. }

3 封装 和 多态

3.1 说明

        1、Dart中的多态体现在方法重写,向上转型

        2、比如上面Boy子类中的方法重写,我们也可以再定义一个Girl子类重写;

        3、向上转型,向下转型这里做一个简单的介绍,具体代码可在我的资源中下载去看

        4、向上转型可以提取公共方法,向下转型可以转化到子类,调用子类方法,向上转型也是一种封装

3.2 实例

        A is B 判断A是否是B类型

        A as B 把A类型转换为B类型

  1. if(p is Boy){
  2.     Boy boy=p as Boy;
  3.     boy.playBoy();
  4. }

4 接口

dart中类就是接口,和声明抽象类一样,一般是用abstract修饰

代码

  1. abstract class Person {
  2.   void run();
  3. }
  4. class Student implements Person {
  5.   @override
  6.   void run() {
  7.     print("run 执行了。。。")
  8.   }
  9. }

5 Mixins

5.1 说明

        实际上就是多继承

                通过mixins实现类似多继承,但是mixins不属于继承,也不属于接口,就是一种新的特性

                作为mixins的类只能继承于最终父类Object,不可以继承别的类

                mixins类不能有构造函数

                一个类可以继承于多个mixins

        Mixins是Dart里面的一个全新概念,简单来说,用来复用多个类之间的代码,减少耦合,换句话来说,可以从中扩展方法(或变量)而不扩展类

5.2 示例

5.2.1 场景

        工程师 = 软件工程师 + 建筑工程师

        教师 = 美术教师 + IT教师

        工作者 = 教师 + 工程师

5.2.2 图例

5.2.3 java实现

  1. //工作者
  2. abstract class Worker {
  3.     public abstract void doWork();//工作者需要工作
  4. }
  5. //工程师
  6. class Engineer extends Worker {
  7.     @Override
  8.     public void doWork() {
  9.         System.out.println("工程师在工作");
  10.     }
  11. }
  12. //教师
  13. class Teacher extends Worker {
  14.     @Override
  15.     public void doWork() {
  16.         System.out.println("教师在教学");
  17.     }
  18. }
  19. //软件工程师
  20. class SoftwareEngineer extends Engineer {}
  21. //建筑工程师
  22. class BuildingEngineer extends Engineer {}
  23. //美术教师
  24. class ArtTeacher extends Teacher {}
  25. //IT教师
  26. class ITTeacher extends Teacher {}

5.3.4 Dart实现

  1. //工作者
  2. abstract class Worker {
  3.   void doWork();//工作者需要工作
  4. }
  5. //工程师
  6. class Engineer extends Worker {
  7.   void doWork() {
  8.     print('工程师在工作');
  9.   }
  10. }
  11. //教师
  12. class Teacher extends Worker {
  13.   void doWork() {
  14.     print('教师在教学');
  15.   }
  16. }
  17. //软件工程师
  18. class SoftwareEngineer extends Engineer {}
  19. //建筑工程师
  20. class BuildingEngineer extends Engineer {}
  21. //美术教师
  22. class ArtTeacher extends Teacher {}
  23. //IT教师
  24. class ITTeacher extends Teacher {}

5.4 扩展功能

5.4.1 图例

5.5 如果使用Java,那么我们自然就想到了使用interface。

5.5.1 代码示例

  1. interface CanFixComputer {
  2.     void fixComputer();
  3. }
  4. interface CanDesignSoftware {
  5.     void designSoftware();
  6. }
  7. //软件工程师
  8. class SoftwareEngineer extends Engineer implements CanFixComputer, CanDesignSoftware {
  9.     @Override
  10.     public void fixComputer() {
  11.         System.out.println("修电脑");
  12.     }
  13.     
  14.     @Override
  15.     public void designSoftware() {
  16.         System.out.println("设计软件");
  17.     }
  18. }
  19. //IT教师
  20. class ITTeacher extends Teacher implements CanFixComputer {
  21.     @Override
  22.     public void fixComputer() {
  23.         System.out.println("修电脑");
  24.     }
  25. }

5.5.2 说明

        但是,我们知道Dart当中没有interface的概念,但并不意味着这门语言没有接口,事实上,Dart任何一个类都是接口,你可以实现任何一个类,只需要重写那个类里面的所有具体方法。

        如果要用Dart来实现的话,只需要将interface修改成abstract class。

        但是我们发现,fixComputer这个接口被继承了两次,并且两次的实现都是一样的,这里就出现了代码重复和冗余的问题。怎么办呢?在java中我们有接口的default实现来解决这个问题(这是一个java8出现的不得已的方案。)

        但是,有了mixins之后,这件事就变得不那么难了。

5.6 Dart的处理

  1. abstract class CanFixComputer {
  2.   void fixComputer() {
  3.     print('修电脑');
  4.   }
  5. }
  6. abstract class CanDesignSoftware {
  7.   void designSoftware() {
  8.     print('设计软件');
  9.   }
  10. }
  11. //软件工程师
  12. class SoftwareEngineer extends Engineer
  13.     with CanFixComputerCanDesignSoftware {}
  14. //IT教师
  15. class ITTeacher extends Teacher with CanFixComputer {}
  16. main() {
  17.   ITTeacher itTeacher = new ITTeacher();
  18.   itTeacher.doWork();
  19.   itTeacher.fixComputer();
  20.   SoftwareEngineer softwareEngineer = new SoftwareEngineer();
  21.   softwareEngineer.doWork();
  22.   softwareEngineer.fixComputer();
  23.   softwareEngineer.designSoftware();
  24. }

通过以上代码,我们可以看到这里不用implements,更不是extends,而是with。

        每个具有某项特性的类不再需要具体去实现同样的功能,接口是没法实现功能的,而通过继承的方式虽然能实现功能,但已经有父类,同时不是一个父类,又不能多继承,所以这个时候,Dart的Mixin机制就比Java的接口会高效,开发上层的只需要关心当前需要什么特性,而开发功能模块的关心具体要实现什么功能。

5.7 无论是extends、implements还是mixin,优先级最高的是在具体类中的方法。

  1. class First {   
  2. void doPrint() {     
  3. print('First');   
  4. }
  5. }
  6. class Second {   
  7. void doPrint() {     
  8. print('Second');   
  9. }
  10. }
  11. class Father {   
  12. void doPrint() {     
  13. print('Father');   
  14. }
  15. }
  16. class Son1 extends Father with First,Second { }
  17. class Son2 extends Father with First implements Second {
  18. main() {
  19. Son1 son1 = new Son1();   
  20. son1.doPrint(); // Second   
  21. Son2 son2 = new Son2();   
  22. son2.doPrint(); // First
  23. }
  24. }

其实在Son2中implements只是说要实现他的doPrint()方法,这个时候其实具体实现是First中Mixin的具体实现。

而Mixin的具体顺序也是可以从代码倒过来看的,最后mixin的优先级是最高的。

优先级 with>extends>implements

6 泛型

6.1 说明

        在Dart当中,有很多容器对象,在创建对象时都可以定义泛型类型,这一点和Java是一样。

        Java中的泛型信息是编译时的,泛型信息在运行时是不存在的。

        Dart的泛型类型是固化的,在运行时也有可以判断的具体类型。

6.2 示例

  1. var list = List<String>();   
  2. list.add('aaa');   
  3. list.add('bbb');   
  4. list.add('ccc');   
  5. print(list);   
  6. var map = Map<intString>();   
  7. map[1] = 'aaaa';   
  8. map[2] = 'bbbb';  
  9. map[3] = 'cccc';   
  10. print(map);

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/955687
推荐阅读
相关标签
  

闽ICP备14008679号