Flutter——dart 面向对象(三)
1. Dart 的继承
在Dart中类是单继承的,使用extends
来继承一个类,子类会继承除了构造方法
之外的属性和方法。
创建一个Person类。
class Person {
String? name;
int? age;
int? _height;
bool get isFree => _height!< 110;
run() {
print("run run run");
}
创建一个Student类继承自Person。
class Student extends Person {
study() {
print("study study study");
}
}
子类可以访问父类的非私有属性和方法,
Student s1 = Student();
s1.age = 20;
s1.run();
子类可以重写父类的方法,这样子类就会调用重写后的方法。
@override
// TODO: implement isFree
bool get isFree => age! < 18;
@override
run() {
// TODO: implement run
print("student run");
}
子类会自动继承默认构造方法。如果是有名字或者带参数的构造方法的话,那么就要主动调用。 父类
class Person {
String? name;
int? age;
int? _height;
bool get isFree => _height!< 110;
run() {
print("run run run");
}
Person(this.age){ print("Person Person Person");}
Person.init();
}
子类(这里可以只实现一个):
class Student extends Person {
Student.init() : super.init();
Student(int? age) : super(age);
study() {
print("study study study");
}
@override
run() {
// TODO: implement run
print("student run");
}
@override
// TODO: implement isFree
bool get isFree => age! < 18;
}
2. 抽象类和接口
抽象类是不能被实例化的类,使用abstract修饰。
抽象类中可以声明抽象方法。
abstract class AbstractClass {
// 抽象方法,只能放在抽象类
int sum(int a,int b);
其他的类如果继承自抽象类,则必须实现抽象类里面的所有抽象方法。
class Subclass extends AbstractClass {
@override
int sum(int a, int b) {
return a + b;
}
}
这里就有个问题,这样就只能继承一个抽象类。这里就需要用implements来实现继承多个抽象类。
class Subclass implements AbstractClass,AbstractClass1 {
@override
int sum(int a, int b) {
return a + b;
}
}
如果implements 一个class,则需要实现所有的属性和方法。当然这样是 没必要的,一般只对抽象类进行implements。
3. 混入Mixins
mixin是面向对象程序设计语言中的类,提供了方法的实现。其他类可以访问mixin类的方法、变量而不必成为其子类。Mixin 的作用就是在多个类层次结构中重用类的代码。 Mixins 其实就是多继承:
class D extends A with B,C {
}
这样就可以调用不同类中的方法。
D d = D();
d.a();
d.b();
d.c();
这里有个问题,如果三个类中的方法是同一名字,那么会调用哪个类的呢?运行后发现是c,那么也就是说,这里会调用最后一个继承的类里面的方法。
混入有个限制就是混入的类不能实现构造函数,否则就会报错。
作为混入的类如果有继承除Object以外的类的话,那么就会提醒The class 'C' can't be used as a mixin because it extends a class other than 'Object'.
。这是因为如果C继承的类如果有带有参数的构造函数,那么就会报错。
如果D中没有自己的属性和方法的时候,那么混入就可以缩写成。
class D = A with B,C;
4. 操作符重载
在Dart中,如果想要比较两个类的大小或者其他的操作,需要用到操作符重载。 如果没有操作符重载,下面的代码是会报错的。
void operatorDemo() {
OperatorClass o1 = OperatorClass(22);
OperatorClass o2 = OperatorClass(23);
print(o1 > o2);
}
重载了>号之后,就可以正常的比较大小了。
class OperatorClass {
int age;
OperatorClass(this.age);
bool operator >(OperatorClass other) => this.age > other.age;
}
转载自:https://juejin.cn/post/7014288156828631070