likes
comments
collection
share

Flutter——dart 面向对象(三)

作者站长头像
站长
· 阅读数 3

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修饰。

Flutter——dart 面向对象(三)

抽象类中可以声明抽象方法。

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。

Flutter——dart 面向对象(三)

3. 混入Mixins

mixin是面向对象程序设计语言中的类,提供了方法的实现。其他类可以访问mixin类的方法、变量而不必成为其子类。Mixin 的作用就是在多个类层次结构中重用类的代码。 Mixins 其实就是多继承:

class D extends A with B,C {
}

这样就可以调用不同类中的方法。

  D d  = D();
  d.a();
  d.b();
  d.c();

这里有个问题,如果三个类中的方法是同一名字,那么会调用哪个类的呢?运行后发现是c,那么也就是说,这里会调用最后一个继承的类里面的方法。

Flutter——dart 面向对象(三)

混入有个限制就是混入的类不能实现构造函数,否则就会报错。

Flutter——dart 面向对象(三)

作为混入的类如果有继承除Object以外的类的话,那么就会提醒The class 'C' can't be used as a mixin because it extends a class other than 'Object'.。这是因为如果C继承的类如果有带有参数的构造函数,那么就会报错。

Flutter——dart 面向对象(三)

Flutter——dart 面向对象(三)

如果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;
}