Dart系列 --- 抽象类,多态,接口

Dart中的抽象类

Dart中的抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口

  • 抽象类用abstract关键字声明
  • 抽象类中没有方法体的方法是抽象方法
  • 抽象类中可以定义普通方法
  • 抽象方法不能使用abstract关键字
  • 抽象类作为接口使用的时候必须实现所有的属性和方法
  • 抽象类不能被实例化
  • 继承抽象类的子类可以实例化
  • Dart中没有interface关键字
abstract class People {

  late int peopleNumber;

  void say();

  // 抽象方法不能使用abstract修饰
  // abstract eat();
}

子类继承抽象类,必须实现抽象类的抽象方法


class Man extends People {
  @override
  void say() {
    print("我是一个男人");
  }
}

void main() {
  var firstMan = Man();
  firstMan.say();
}

抽象类作为接口使用的时候必须实现所有的属性和方法

class WoMan implements People {
  @override
  late int peopleNumber;

  @override
  void say() {
    peopleNumber = 2;
    print("一共有$peopleNumber个人");
  }
}

void main() {
  var firstWoMan = WoMan();
  firstWoMan.say();
}

Dart中的多态

  • 子类实例化赋值给父类引用
  • 多态就是父类定义一个方法,让继承的子类实现其方法,并且每个子类都有自己独有的方法
  • 父类引用无法调用子类独有的方法
abstract class People {
  late int peopleNumber;

  void say();

  /// 抽象方法不能使用abstract修饰
  // abstract eat();
}

class Man extends People {
  @override
  void say() {
    print("我是一个男人");
  }

  void getMan() {
    print('获取一个男人');
  }
}

void main() {
  People people = Man();
  people.getMan();
}

Error: The method 'getMan' isn't defined for the class 'People'.

Dart中的接口

  • Dart中没有interface关键字来定义接口,但是普通类和抽象类都可以作为接口被实现,使用implements关键字进行实现
  • 如果实现的类是普通类,需要将普通类和抽象中的属性和方法全重写
  • 抽象类可以定义抽象方法,普通类不可以,所以一般如果要实现接口方式,使用抽奖类定义接口
abstract class Animal {
  late int animalNumber;

  eat();
  run();

  say() {
    print('我是一个动物');
  }
}

class Cat extends Animal {
  @override
  eat() {
    print('我要吃东西');
  }

  @override
  run() {
    print('我要奔跑');
  }
}

class Dog implements Animal {
  @override
  late int animalNumber;

  @override
  eat() {
    print('我要吃东西');
  }

  @override
  run() {
    print('我要奔跑');
  }

  @override
  say() {
    print('我要大叫');
  }
}
继承和实现的区别
  • 继承只会重写抽象类里的抽象方法
  • 实现会重写抽象类里的变量,抽象方法和正常方法

Dart中的类可以实现多个接口

abstract class People {
  late int peopleNumber;

  void say();

  /// 抽象方法不能使用abstract修饰
  // abstract eat();
}

class Children implements Animal, People {
  @override
  int animalNumber = 1;

  @override
  int peopleNumber = 1;

  @override
  Object? eat() {
    print("我要吃饭");
  }

  @override
  void run() {
    print("我要奔跑");
  }

  @override
  Object? say() {
    print("我要大叫");
  }
}

一个类实现多个接口,如果多个接口拥有用一个方法或抽象方法并且两个方法返回值不一致,重写方法默认返回值是Object

什么时候用抽象类 & 接口

  • 如果要复用抽象类里面的方法,并且要用抽象方法约束子类的话,就用extends继承抽象类。
  • 如果只是把抽象类当做标准的话,就用implements实现抽象类。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值