查看: 113|回复: 0

Dart中的抽象类 多态 和 接口

[复制链接]

2

主题

7

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2023-1-1 14:41:57 | 显示全部楼层 |阅读模式
Dart中抽象类:

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

  • 抽象类通过abstract关键字来定义。
  • Dart中的抽象方法不能用abstract声明,Dart中没有方法体的方法称为抽象方法。
  • 如果子类继承抽象类必须得实现里面的抽象方法。
  • 如果把抽象类当做接口实现的话必须得实现抽象类里面定义的所有属性和方法。
  • 抽象类不能被实例化,只有继承它的子类可以。


  • extends抽象类 和 implements的区别:

  • 如果要复用抽象类里面的方法,并且要用抽象方法约束子类的话,就用extends继承抽象类。
  • 如果只是把抽象类当做标准的话,就用implements实现抽象类。
// 定义一个Animal类要求它的子类必须包含eat方法  抽象类主要定义标准
abstract class Animal {
eat(); // 抽象方法 不定义方法体
run(); // 抽象方法
printInfo(){ // 抽象类中的普通方法
  print("抽象类的普通方法");
}
}

class Dog extends Animal{
// 如果继承类抽象类 子类必须定义父类的抽象方法
@ovveride
eat(){
  print("小狗吃骨头");
}
@ovveride
run(){
  print("小狗在奔跑");
}
}

class Cat extends Animal{
// 如果继承类抽象类 子类必须定义父类的抽象方法
@ovveride
eat(){
  print("小猫吃鱼干");
}
@ovveride
run(){
  print("小猫在奔跑");
}
}
}
main(){
Dog d = new Dog();
d.eat();

Cat c = new Cat();
c.eat();

// Animal  a = new Animal(); // 抽象类无法实现实例化
c.printInfo();
d.printInfo();
}

  • Dart中的多态:

  • 允许将子类类型的指针赋值给父类类型的指针,同一个函数调用会有不同的执行效果。
  • 子类的实例赋值给父类的引用。
  • 多态就是父类定义一个方法不去实现,让继承它的子类去实现,每个子类有不同的表现。
// 定义一个Animal类要求它的子类必须包含eat方法  抽象类主要定义标准
abstract class Animal {
eat(); // 抽象方法 不定义方法体
printInfo(){ // 抽象类中的普通方法
  print("抽象类的普通方法");
}
}

class Dog extends Animal{
// 如果继承类抽象类 子类必须定义父类的抽象方法
@ovveride
eat(){
  print("小狗吃骨头");
}
}

class Cat extends Animal{
// 如果继承类抽象类 子类必须定义父类的抽象方法
@ovveride
eat(){
  print("小猫吃鱼干");
}
}
}
main(){
Dog d = new Dog();
d.eat();

Cat c = new Cat();
c.eat();

// Animal  a = new Animal(); // 抽象类无法实现实例化

Animal b = new Dog(); // 父类约束子类
b.eat();
}Dart 接口:
Dart 和 java 一样,dart也有接口,但是和java还是有区别的。首先,dart的接口没有interface关键字定义接口,而是普通类或抽象类都可以作为接口被实现。同样使用implements关键字进行实现。但是dart的接口有点特别,如果实现的类的时普通类,会将普通类和抽象中的属性的方法全部需要覆写一遍。而因为抽象类可以定义抽象方法,普通类不可以,所以一般如果要实现向java接口那样的方式,一般会使用抽象类。建议使用抽象类定义接口。
库 支持mysql mssql mongdb
mysql mssql mongdb 三个类里面都有同样的方法
*/
abstract class Db{ // 抽象类当做接口 接口: 约定、规范
  String uri; //数据库的连接地址
  add(String data);
  save();
  delete();
}

class Mysql implements Db{
@override
String uri;
Mysql(this.uri);

@override
add(String data){
  print("mysql的add方法--${data}")

@override
  save(){

  }
@override
  delete(){
  
  }
}

class Mssql implements Db{
@override
String uri;

@override
add(String data){
  print("mssql的add方法--${data}")
}
@override
  save(){

  }
@override
  delete(){
  
  }
}

void main(){
Mysql mysql = new Mysql("xxxxxxxxxx");
mysql.add("1231231");
}
// 实现分离 模块化Db.dart:
abstract class Db{ // 抽象类当做接口 接口: 约定、规范
  String uri; //数据库的连接地址
  add(String data);
  save();
  delete();
}Mysql.dart:
import "Db.dart";
class Mysql implements Db{
@override
String uri;
Mysql(this.uri);

@override
add(String data){
  print("mysql的add方法--${data}")

@override
  save(){

  }
@override
  delete(){
  
  }
}Mssql.dart:
import "Db.dart";

class Mssql implements Db{
@override
String uri;

@override
add(String data){
  print("mssql的add方法--${data}")
}
@override
  save(){

  }
@override
  delete(){
  
  }
}
Main.dart:
import "Mysql.dart";
import "Mssql.dart";
void main(){
Mysql mysql = new Mysql("xxxxxxx");
mysql.add("123123");
Mssql mssql = new Mssql("xxxxx");
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表