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