跟着测试代码学会Dart2.x的面向对象

Dart中的方法

  • 方法也是一个对象:使用场景作为参数传递
  • 返回值和参数类型可以省略
  • 当方法的执行语句只有一句的时候:可以使用箭头函数 => 表达式
  • 可选参数:传递参数的时候必须带上形参的名字
  • 匿名方法:没有方法名称的方法
  • 闭包 closure
    • 定义在函数里的函数就是闭包, 闭包也是一个对象.
    • 闭包的作用: 可以访问外部函数的局部变量.
void testClosure() {
    var func = funA();
    func();
    func();
    func();
    func();
    var func2 = funA();
    func2();
    func2();
    func2();
    func2();
}

funA() {
    int count = 0; // 被访问的变量不会被释放
    return () => print(count++); // 这个匿名函数就是一个闭包
}

执行结果

[图片上传失败...(image-ab7c8c-1636857372306)]

Dart的OOP

终端创建一个基于OC的Flutter项目flutter create -objc dart_oop

类和对象

  • 使用class关键字声明一个类
  • 可以使用new跟上构造函数
  • 所有的对象默认都继承Object类
  • Dart中会默认生成getter和setter方法
  • 属性和方法都通过点语法.访问
  • final修饰的属性必须定义初始值
  • 方法名一样, 参数不一样, 方法不能重载!

类的构造函数

  • 一旦定义了构造函数, 默认的构造函数就失效了
  • 当一个对象所有的成员属性都是final的时候, 这个对象可以被创建为常量对象
  • 构造函数前加上const, 常量对象
void main() {
    JHPerson p = JHPerson();
    p.name = 'Jack';
    p.age = 22;
    p.run();
}

class JHPerson {
    final String name2 = 'Jack2'
    String? name;
    int? age;
    int _weight; // 不能被外界跨文件访问, 加上_, 同一份文件可以访问
    final height;
    
    // 初始写法
    JHPerson(int age, String name, int weight) {
        name = name;
        age = age; // 这样写会重名
        _weight = weight;
        final height;// 外面不允许修改
    }
    
    // 语法糖写法, 
    JHPerson(this.name, this.age, this._weight, this.height);
    
    // 命名构造函数
    JHPerson.bigName(this.name, this._weight);
    
    // const修饰构造函数, 创建常量对象
    const JHPerson(this.name, this._weight);
    
    void run() {
        print('$age 岁的 $name 在奔跑🏃🏻♀️')
    }
    
    void _go() {
        print('$_weight 斤的 $name 在Go')
    }
    
    void printP() {
        _go();
    }
    
    void addAge(int age) {
        this.age = age;
    }
}

Dart的工厂构造&单例对象&初始化列表

factory_class.dart

class FactoryClass {
    // 需要一个单列对象
    static FactoryClass? _instance;
    
    factory FactoryClass() => _instance ??= FactoryClass._init();
    //{
    //    if (_instance == null) {
    //      _instance = FactoryClass._init();
    //  }
    //  
    //  return _instance!;
    //    }
    
    // 私有的命名构造函数
    FactoryClass._init();
}

初始化列表

  • 目的:
  • 给final变量赋值
  • 校验传递的参数值
void personDemo() {
    Person p = Person('jack', -1, -2);
}


class Person {
    String name;
    init age;
    final height;
    
    Person(this.name, this.age, int h)
        : height = h,
          assert (h >= 0),
          assert (age >= 0 ){
              print('name:$name age:$age height:$height');
          }
}

类方法和对象操作符

  • 类方法, 静态的static
  • 静态属性用类名访问
void staticDemo(){
        //StaticClass st;
        //st.count;
 
    StaticClass.count = 12;
    print(StaticClass.sum(1));
    
    StaticClass st = StaticClass();
    st.currentCount = 10;
    StaticClass.count = 11;/ /静态的, 在内存中只有一份
    print(st.sum2(20));
    
    StaticClass st2 = StaticClass();
    st2.currentCount = 1;
    print(st2.sum2(20));
}

class StaticClass {
    // 静态属性
    static int count = 1;
    // 实例属性
    int currentCount = 0;
    
    static const String str = 'jack';
    
    // 静态方法
    static int sum(int a) {
        return a + count;
    }
    
    // 实例方法, 可以访问非静态成员
    int sum2(int a) {
        return currentCount + a + count;
    }
    
    var s1 = Object();
    s1 = StaticClass();
    print((s1 as StaticClass).sum2(10));// 强制类型转换
    // s1 = null;
    print(s1.sum2(10));
    
    if (s1 is StaticClass) {
        print(s1.sum2(10));
        print(s1..currnetCount = 15..sum2(20));// 链式编程, 连续调用. 返回值是对象本身
    }
}

Dart的继承

  • 使用extends继承一个类
  • 子类会继承除了构造方法以外的属性和方法
  • Dart是单继承的
  • 默认继承Object
  • 继承的子类会继承默认构造方法
  • 如果构造方法有参数/有名字, 要主动调用
  • 初始化列表要写在super前面
void extendsDemo() {
    Student st = Student();
    st.run();
    st.sutdy();
    st.name = 'Jack';
    st.age = 18;
    
    print(st.isFree);
    
    Person st1 = Studyent();
    st1.run();
    if (st1 is Student) {
        st1.sutdy();
        st1.age = 17;
        print(st1.isFree);
        print(st1);
    }
}

class Student extends Person {
    final String subName;
    
    Student.withName(String? name) : subName = name!, super.withName(name);
    
    Student() : super.init();
    
     study() {
         print('写作业');
     }
 
     @override
     bool get isFree => age! < 18;
 
     @override
     run() {
         print('学生在跑');
     }
 
     @override
 
}



class Person {
    Person.init();
    
    String? age;
    int? age;
    int? _height;
    bool get isFree => _height! < 120;
    
    run() {
        print('人在跑');
    }
}

Dart的抽象类接口

  • 有点类似协议接口
  • 是不能被实例化的类abstract修饰
  • 继承一个抽象类, 必须要实现里面的抽象方法
abstractDemo() {
    AbstractClass as = SubClass();
    as.sum(10, 20);
    
    SubClass1 sc = SubClass1();
    sc.sum(10, 20);
    sc.sum1(10, 20);
}


abstract class AbstractClass {
    // 抽象方法, 没有实现
    int sum(int a, int b);
}

abstract class AbstractClass1 {
    // 抽象方法, 没有实现
    int sum1(int a, int b);
}

abstract class AbstractClass2 {
    // 抽象方法, 没有实现
    int sum2(int a, int b);
}


class SubClass extends AbstractClass {
    @override
    int sum(int a, int b) {
        print('a + b = ${a + b}');
        return a + b;
    }
}

class SubClass1 implements AbstractClass, AbstractClass1, AbstractClass2 {
    @override
    int sum(int a, int b) {
        print(subClass..sum);
        return 0;
    }
    
    @override
    int sum1(int a, int b) {
        print(subClass..sum1);
        return 0;
    }
    
    @override
    int sum2(int a, int b) {
        print(subClass..sum2);
        return 0;
    }
}

Dart的(多继承)Mixins混入

  • 混入, 类似多继承
  • 作为混入类, 是不能实现构造方法的.
mixinDemo() {
    D d = D();
    d.a();
    d.b();
    d.c();
}

operatorDemo() {
    OperatorClass op1 = OperatorClass(18);
    OperatorClass op2 = OperatorClass(19);
    
    print(op1 > op2);
}

class OperatorClass {
    int age;
    OperatorClass(this.age);
    bool operator >(OperatorClass other) => this.age > other.age;
}

class A {
    a() => print('a....');
}

class B {
    b() => print('b....');
}

class C {
    a() => print('c....'); // 跟A同名的, C在后面, 会覆盖
}



// class D extends A with B, C {}
classD= A with B,C;// 简写


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容