Dart的类继承
一起从0开始学习Flutter!
前面介绍了在Dart中的类和属性的写法已经特点,接下来学习它的继承、接口、抽象类的特点。 Dart也是单继承的方式,我们如果要继承其他的类需要在类名后面添加extends关键字。 在上节介绍的类里的Person作为父类,添加一个学生类:
class Student extends Person{//学生类继承了Person类的所有公有属性和方法
String grader;
Student({String name,String sex,int age = 15,this.grader}):super(name:name,sex:sex,age:age); //子类的构造方法,子类的构造方法里没有办法再添加新的代码了,只能给父类和自己的属性赋值了。
//Student({String name,String sex,int age = 15,String grader}):this.grader = grader,super(name:name,sex:sex,age:age); 构造方法还可以这样写
//覆写了Person类的call方法
@override
void call(){
print("student name is $name,age is $age,grader is ${this.grader}");
}
}
在main方法中的使用跟直接使用Person类的时候是一样的:
var student = Student(name:"LiLei",grader: "七年级二班");
student();//student name is LiLei,age is 15,grader is 七年级二班
在Dart也是有有抽象类的存在,与其他语音一样抽象类是无法直接被实例化的,我们需要创建一个类来实现抽象类中的方法。
class MathTeacher extends Teacher{
MathTeacher({String name,String sex,int age}):super(name:name,sex:sex,age:age);
@override
void teach(){
print("math teacher name is $name");
}
}
abstract class Teacher extends Person{
Teacher({String name,String sex,int age}):super(name:name,sex:sex,age:age);
void teach();
}
不过有一个特别的使用,在Dart是没有interface的,可以使用抽象类来代替,还是用老师的例子,数学老师的工作是教数学。
abstract class Work{//创建一个抽象类来代替的interface
void doWork();
}
class MathTeacher extends Teacher implements Work{//抽象类可以用来继承也可以用implements
MathTeacher({String name,String sex,int age}):super(name:name,sex:sex,age:age);
@override
void teach(){
print("math teacher name is $name");
}
void doWork(){//实现implements里的方法
print("math teachers teach math");
}
}
然后我们在main方法中调用老师work的方法。
Work work = MathTeacher(name:"张",sex:"female");
work.doWork();//math teachers teach math
当然我们使用普通的任何类都是可以当做接口类来使用的,但是我们需要重写原来类的所有属性和方法,所以一般情况我们还是使用一个抽象类来作为接口类。
在Dart中还有一个概念是Mixins,我们开始说了Dart也是单继承的,但是我们可以通过with关键字来将多个类的属性和方法合并到一个类中,如果出现同名方法则会根据with后跟的类的先后属性进行覆盖,with也是可以单独使用省略掉extends关键字。with的类当中不能有显示声明的构造方法并且只能是继承自Object。
class Test extends Test1 with Test2,Test3{//with多个类时中间用逗号分隔。
}
//class Test = Test1 with Test2,Test3;上面的代码可以简写成这样,看起来像把他们组合在了一起
class Test1{
void test(){
print("test1");
}
}
class Test2{
void test(){
print("test2");
}
}
class Test3{
void test(){
print("test3");
}
}
在main函数中我们调用Test的test方法试一下
var test = Test();
test.test();//test3
看到结果是打印输出了我们最后一个with的方法。