Dart类的继承及super的使用

2022-02-15  本文已影响0人  见字如晤一

学习java时我们都知道面对对象的三大特性:封装 、继承、多态

Dart中的继承是什么样的呢?

Dart中的类的继承:  
    1、子类使用extends关键词来继承父类
    2、子类会继承父类里面可见的属性和方法 但是不会继承构造函数
    3、子类能复写父类的方法 getter和setter

我们先来看一段代码:

class Person {
  String name = "";
  late int age;
  late String _work;

  Person(String name) {
    this.name = name;
  }

  void setName(String n) {
    this.name = n;
  }

  set setAge(int age) {
    this.age = age;
  }

  //私有属性_work的setter和getter函数
  String get work => _work;

  set setWork(String value) {
    _work = value;
  }

  void working() {
    print("Person is working 姓名:$name -- 年龄:$age -- 工作:$_work");
  }
}

//当父类Person自定义了同名构造方法,那么默认的不带参数构造方法会被覆盖
//此时定义的子类,必须声明一个构造方法,去调用super的构造方法
//The superclass 'Person' doesn't have a zero argument constructor.
// Try declaring a zero argument constructor in 'Person',
// or declaring a constructor in Woman
// that explicitly invokes a constructor in 'Person'.
class Woman extends Person {
  Woman(String name, int age) : super(name) {
    this.name = name;
    this.age = age;
  }

  @override
  void working() {
    super.working();
    print("子类working");
  }

  @override
  set setWork(String value) {
    super.setWork = "子类工作";
  }
}

void main() {
  //虽然父类有只带参数name的构造函数,但是子类并没有继承
  //子类必须有调用supper构造方法的构造方法,默认无参数时是默认实现的
  var obj = Woman("李四", 20);
  obj as Person;
  obj.setWork = "王五";
  obj.working();
}

运行结果:

Person is working 姓名:李四 -- 年龄:20 -- 工作:子类工作
子类working

通过上面的代码,我们总结得到:
1、stter/getter方法,用编译器自动生产时,只有私有属性才能自动生成,且方法名是去掉下划线的同名方法。(私有属性是以下划线开头的属性)

getter方法名后不需要加()

2、公有属性自定义写setter方法时会发现,方法名不能同属性名一样。

3、父类自定义了同名构造函数(带参),子类就必须明确定义一个至少带该参数的构造函数,并通过:super(参数)方式调用父类的构造方法。

4、子类能够复写父类中的set/get方法。

5、super关键字的使用:①调用父类有参构造方法。 ②覆写父类方法时,在子类中调用父类方法。

上一篇 下一篇

猜你喜欢

热点阅读