学习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关键字的使用:①调用父类有参构造方法。 ②覆写父类方法时,在子类中调用父类方法。
网友评论