Flutter - Dart 基础(类的继承)

295 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情

类的继承

继承是面向对象三大特性之一。Dart 中的继承为单继承


Dart 中的继承格式,使用关键字 extends 修饰

class Person {
    //...
}

class Student extends Person {
    //...
}

继承父类的公有属性及方法

class Person {
    late String name;
    late int age;
    
    bool get getAdult {
        return age > 18;
    }
    
    void sayHI() {
        print("父类方法。\n name:$name,age: $age, adult:$getAdult");
    }
}

class Student extends Person {
    //...
}

void main(List<String> args) {
    final stu = Student();
    stu.name = "dart";
    stu.age = 15;
    stu.sayHI();
}

log:
父类方法。
name:dart,age: 15, adult:false

重写父类的计算属性

class Person {
    late String name;
    late int age;
    
    bool get getAdult {
        return age > 18;
    }
    
    void sayHI() {
        print("父类方法。\n name:$name,age: $age, adult:$getAdult");
    }
}

class Student extends Person {

    // 重写父类计算属性
    bool get getAdult {
        return age > 10;
    }
}

void main(List<String> args) {
    final stu = Student();
    stu.name = "dart";
    stu.age = 15;
    stu.sayHI();
}

log:
父类方法。
name:dart,age: 15, adult:true

重写父类的方法,使用 @override 修饰

class Person {
    late String name;
    late int age;

    bool get getAdult {
        return age > 18;
    }

    void sayHI() {
        print("父类方法。\n name:$name,age: $age, adult:$getAdult");
    }
}

class Student extends Person {
    // 重写父类计算属性
    bool get getAdult {
        return age > 10;
    }
    
    // 重写父类方法
    @override
    void sayHI() {
        print("子类重写父类方法。\n name:$name,age: $age, adult:$getAdult");
    }
}

void main(List<String> args) {
    final stu = Student();
    stu.name = "dart";
    stu.age = 15;
    stu.sayHI();
}

log:
子类重写父类方法。
name:dart,age: 15, adult:true

继承中的构造方法

  • 子类的构造方法默认会调用父类的默认构造方法

    class Person {
        Person() {
            print("父类默认初始化");
        }
    }
    
    class Student extends Person {
        //...
    }
    
    void main(List<String> args) {
        final stu = Student();
    }
    
    log:
    父类默认初始化
    
  • 如果父类拥有有参数的默认构造方法,则子类的构造方法必须在初始化列表中通过 super 显式调用父类的这个构造方法

    class Person {
        late String name;
        late int age;
        
        Person(this.name, this.age) {
            print("父类有参数初始化");
        }
    }
    
    class Student extends Person {
        
        // 子类构造方法参数后使用 : 显示调用父类构造方法
        Student(String name, int age) : super(name, age);
    }
    
    void main(List<String> args) {
        final stu = Student("dart", 18);
    }
    
    log:
    父类有参数初始化