首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Dart语法基础系列八《抽象类》

Dart语法基础系列八《抽象类》

作者头像
星宇大前端
发布2021-11-18 15:05:35
发布2021-11-18 15:05:35
64100
举报
文章被收录于专栏:大宇笔记大宇笔记
运行总次数:0

抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。

抽象类概述

通常在编程语句中用 abstract 修饰的类是抽象类。在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象;在java中,含有抽象方法的类称为抽象类,同样不能生成对象。

抽象类是不完整的,它只能用作基类。在面向对象方法中,抽象类主要用来进行类型隐藏和充当全局变量的角色。

抽象类通常应用于定义接口。

抽象类特点:

  • 不能实例化
  • 类似接口,可以部分实现
  • 可以继承
  • 类可以利用抽象类完成多继承

抽象类作用一:类的约束实现

这个例子可以验证一下知识点和思想:

  • 抽象类继承
  • implements实现抽象类的约束
  • 多实现去约束
代码语言:javascript
代码运行次数:0
运行
复制
abstract class Person {
  bool canSpeak = true;
  eat() {}
}

abstract class Musical extends Person {
  bool? canSing;
  sing() {}
}

abstract class Studnet extends Person {
  String? className;
  goToSchool() {

  }
}

class MusicMan implements Musical, Studnet {
  @override
  bool? canSing;

  @override
  bool canSpeak = true;

  @override
  String? className;

  @override
  eat() {
    // TODO: implement eat
    throw UnimplementedError();
  }

  @override
  goToSchool() {
    // TODO: implement goToSchool
    throw UnimplementedError();
  }

  @override
  sing() {
    // TODO: implement sing
    throw UnimplementedError();
  }
  
}

那么问题来了,抽象类可以默认实现方法和属性,我想进行代码复用,不需要实现怎么办呢?

看下面的例子。

抽象类作用二:代码复用

我们知道,我们可以通过类的 extends 的继承,来实现复用父类的代码。

abstract class 和 class 类似都可以使用 extends 复用继承。

代码语言:javascript
代码运行次数:0
运行
复制
abstract class Person {
  bool canSpeak = true;
  eat() {
    print('吃饭');
  }
}

abstract class Musical extends Person {
  bool? canSing;
  sing() {}
}

class MusicMan extends Musical {}

void main(List<String> args) {
  var liyundi = new MusicMan();
  liyundi.eat();
}

抽象类作用三:接口约束

我们需要一个函数,参数是一个Person,Musical 和 Student都属于人,所以都应该可以传入。

这时候可以利用这种进行约束,接口设计。都继承于Person抽象类。

代码语言:javascript
代码运行次数:0
运行
复制
abstract class Person {
  bool canSpeak = true;
  eat() {}
}

abstract class Musical extends Person {
  bool? canSing;
  sing() {}
}

abstract class Studnet extends Person {
  String? className;
  goToSchool() {}
}

class MusicMan extends Musical {}

class Children extends Studnet {}

class Dog {}

void main(List<String> args) {
  void testAbs(Person args) {
    print(args);
  }

  var liyundi = new MusicMan();
  var kid = new Children();
  var dog = new Dog();

  testAbs(liyundi);
  testAbs(kid);
  testAbs(dog);
}

Dog 类没有继承于Person 所以不可以赋值,报错。

总结

2、3作用,类其实也是可以的,我的理解dart 的类是包含abstract 的。可以作为接口,也可以实现,接口作为子集,可以作为接口和实现部分。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/11/17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 抽象类概述
  • 抽象类作用一:类的约束实现
  • 抽象类作用二:代码复用
  • 抽象类作用三:接口约束
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档