Flutter学习-06-dart语法学习之继承
1. dart中的继承
我们在dart中类是单继承,子类继承父类的非私有方法和属性
class person{
String? name;
int? _height;
bool get isHigh => (_height??=0) >180;
void sayHello() => print('hello');
}
class student extends person{
}
void extendDemo(){
student s = student();
s.sayHello();
s.name = 'jack';
print(s.isHigh);
}
我们子类可以重写父类的方法,可以不写@override,但是一般也写方便阅读,我们也可以调用父类该方法。
class student extends person{
int? height;
@override
void sayHello() {
// TODO: implement sayHello
super.sayHello();
print('student say hello');
}
@override
// TODO: implement isHigh
bool get isHigh => (height??=0 )>120;
}
父类中如果有一个或多个自定义构造方法,子类必须至少实现其中的一个,不然会报错
子类重写父类方法:
student.withName(String? name) : super.withName(name);
student.init() : super.init();
2. dart中的抽象类
Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口。抽象类不能实例化的类
同时 抽象类通过abstract关键字类定义
abstract class addAbstractClass{
int add(int a,int b);
}
void testDemo(){
addAbstractClass cls = addAbstractClass();
}

2.1 抽象方法
abstract class helloFlutterAPI{
void sayYes();//抽象方法
void sayHello() =>print('hello flutter,today is new day');//方法
}
在abstract中我们把没有方法体的方法称为抽象方法同时Dart中的抽象方法不能用abstract声明,
在非抽象类中定义抽象方法会报错
abstract class addAbstractClass {
void printA() => print('object');
int add(int a,int b);
}
class addSubClass extends addAbstractClass
{
@override
int add(int a, int b) {
// TODO: implement add
return a+b -1;
}
}
子类可以继承抽象类,抽象类的抽象方法要实现,非抽象方法可以直接调用因为它已经实现了。
这其实也是多态,多态就是父类定义一个方法不去实现,让继承他的子类去实现, 每个子类有不同的表现
3.dart中的接口
我们想要实现多个抽象类方法的继承实现对应的方法怎么做呢我们可以实现implements来实现一个或者多个接口
class childClass implements helloFlutterAPI,sumAbstractClasss,addAbstractClass{
@override
String name;
childClass(this.name);//复写属性
@override
sayYes() {
// TODO: implement sayYes
print('yes');
}
@override
void sayHello() {
// TODO: implement sayHello
}
@override
int sum(int a, int b) {
// TODO: implement sum
var sum = a+b+20;
print('sum is $sum');
return sum;
}
@override
void printA() {
// TODO: implement printA
}
@override
int add(int a, int b) {
// TODO: implement add
var sum = a+b;
print('add is $sum');
return sum;
}
}
我们使用implements实现多接口的实现,子类要实现父类的方法,和属性。它们的关系不是继承关系,而是父类就是定义接口,实现接口的子类要覆写接口中的所有属性和方法.
3.1 抽象类作为接口实现
abstract class redClaas {
String color;
redClaas(this.color);
void changeColor(String changeColor);
void printCunrrentColor();
}
class colorClass implements redClaas{
@override
String color;
colorClass(this.color);
@override
void changeColor(String changeColor) {
// TODO: implement changeColor
print(changeColor);
}
@override
void printCunrrentColor() {
// TODO: implement printCunrrentColor
print(this.color);
}
}
将抽象类作为接口使用(类就是接口),让子类来实现(关键字implements来实现)
4. Mixin
官方定义:
Mixin 是复用类代码的一种途径, 复用的类可以在不同层级,之间可以不存在继承关系。
简单说就是在类中混入其他的功能,实现类似多继承的功能
4.1 普通类
class a {
String name = 'a'
void printA()=>print('this is a class');
}
class b{
String name = 'b'
void printB()=>print('this is b class');
}
class c{
String name = 'c'
void printC()=>print('this is c class');
}
class mixClass with a,b,c{
}
实现
void main(List<String> arguments) {
print('Hello world!');
mixinDemo();
}
void mixinDemo(){
mixClass class1 = mixClass();
print(class1.name);//打印结果为c
class1.printA();
class1.printB();
class1.printC();
}
在混入多个类是,类中有相同 的属性或方法,后混入的会将先混入的覆盖掉
6.2 mixin定义
我们使用mixin修饰类的时候不能初始化否则会报错

mixin a {
String name = 'a';
void printA()=>print('this is a class');
}
mixin b{
String name = 'b';
void printB()=>print('this is b class');
}
mixin c{
String name = 'c';
void printC()=>print('this is c class');
}
class mixClass with a,b,c{
}
6.3 混入类的继承问题
混入类不能继承除了Object之外的类,我们换成Object即可

6.4 混入不影响继承
class a {
String name = 'a';
void printA()=>print('this is a class');
}
mixin b{
String name = 'b';
void printB()=>print('this is b class');
}
class c{
String name = 'c';
void printC()=>print('this is c class');
}
class mixClass extends a with b,c{
}
转载自:https://juejin.cn/post/7026634600499642375