一、实现继承

  • 任何类都能被继承;
  • 继承不用重写字段;
  • 继承不需要重写父类的所有方法。
class Phone {
  void startup() {
    print('开机');
  }
  void shutdown() {
    print('关机');
  }
}

class AndroidPhone extends Phone {
}

void main() {
  var p = AndroidPhone();
  p.startup();
  p.shutdown();
}

开机
关机

二、超类

超类,即父类,在子类中,可以用super代表父类,去调用父类的方法和字段。

1.调用超类的方法

(1).继承普通的类

class Phone {
  void startup() {
    print('开机');
  }

  void shutdown() {
    print('关机');
  }
}

class AndroidPhone extends Phone {
  @override
  void startup() {
    super.startup();
    print('AndroidPhone 开机');
  }
}

void main() {
  var p = AndroidPhone();
  p.startup();
}

开机
AndroidPhone 开机

(2).继承抽象类

继承抽象类,如果在子类中调用了父类的抽象方法(未实现),则会报错,提示该方法在超类型中始终是抽象的。

abstract class Mobile {
  int number;
  Mobile(this.number);
  void showNumber() ;
  
}

class AndroidPhone extends Mobile {
  AndroidPhone(super.number);

  @override
  void showNumber() {
    super.showNumber();//调用了超类的抽象方法,会报错。
    print('010-$number');
  }

@override
  noSuchMethod(Invocation invocation) {
   print("没有该方法");
  }
}

2.调用超类的构造函数

  • 继承时,字段不用重写;
  • 继承父类时,如果没有显示的调用父类的构造函数,那么就会默认的去调用父类的无参构造,如果父类有包含参数的构造函数,则去调用父类的无参构造就会调用失败。

(1).普通调用

class Mobile {
  int number;
  Mobile(this.number);
  void showNumber() {
    print('010-$number');
  }
}

class AndroidPhone extends Mobile {
  AndroidPhone(int number) : super(number);
  • AndroidPhone(int number):初始化形式参数 ,把你传进来的参数赋给 AndroidPhone自己的字段number;
  • super(number):在初始化列表里调用父类构造函数,把你传进来的参数赋给父类Mobile的字段number;

(2).超级参数(推荐写法)

class Mobile {
  int number;
  Mobile(this.number);
  void showNumber() {
    print('010-$number');
  }
}

class AndroidPhone extends Mobile {
  AndroidPhone(super.number);
}

3.重写超类函数

class Mobile {
  int number;
  Mobile(this.number);
}

class AndroidPhone extends Mobile {
  AndroidPhone(int number) : super(number);

  @override
  void noSuchMethod(Invocation mirror) {
    print('被重写 noSuchMethod');
  }
}

void main() {
  dynamic p = AndroidPhone(12345678);
  p.showNumber111();
}

被重写 noSuchMethod

3.重写超类的函数

class Mobile {
  int number;
  Mobile(this.number);
}

class AndroidPhone extends Mobile {
  AndroidPhone(int number) : super(number);

  @override
  void noSuchMethod(Invocation mirror) {
    print('被重写 noSuchMethod');
  }
}

void main() {
  dynamic p = AndroidPhone(12345678);
  p.foo();
}

被重写 noSuchMethod

noSuchMethod(Invocation invocation):

  • 是 Dart 的“兜底拦截”机制: 当对象被调用了一个不存在的方法/属性(或调用方式不匹配)时,有机会进入这个方法 。
  • 在 强类型 下,直接写 p.foo() 通常会在编译/分析阶段就报错,根本到不了运行时;用 dynamic (或反射/某些代理场景)才更容易触发 noSuchMethod 。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐