前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Dart学习 抽象类/泛型类/接口/混入

Dart学习 抽象类/泛型类/接口/混入

原创
作者头像
KID.
发布2024-01-30 17:58:42
1390
发布2024-01-30 17:58:42
举报

抽象类

抽象类是对本质相同内容类定义一个标准.有相同本质要实现不同功能的子类可以继承这个类,需要实现其中定义的抽象方法

abstract关键字定义抽象类

举个例子

Result 是一个抽象类, success(); 和 error()是其中的两个方法.子类中需要将这两个抽象方法重写.

抽象类也可有普通方法,所有人相同的公用方法.

多态

定义使用父类的类型,用子类创建实例,就可以使用对应实例里的方法.

(可用与传参接受不同的参数)

代码语言:javascript
复制
void main(List<String> args) {

 RequestResult req = RequestResult(200, 'success', '成功', [1, 2]);

  req.fetch();

  req.error();

  req.success();

 UpdateResult upd = UpdateResult(500, 'error', '失败');

  upd.error();

  upd.success();

 // 多态

 // 定义使用父类的类型,用子类创建实例,就可以使用对应实例里的方法.

 // 可用与传参接受不同的参数

 Result resq = RequestResult(500, 'error', '失败', [3]);

  resq.success();

}

// 抽象类

// 对请求 更新 的结果坐不同的处理

abstract class Result {

 // 类似于制定一个本质相同类的标准

 // 本质功能相同但是有差异的内容需要继承这个类,实现抽象方法。

 int code = 200;

 String type = 'success';

 String msg = '请求成功'; //

 Result(this.code, this.type, this.msg);

 // 普通方法(公用的)

 fetch() {

 // 同样的接受参数

 print('fetch');

  }

 // 抽象方法需要子类自行实现

 // 根据成功和失败需要实现不同的返回方法

 success();

 // error 对不同code 的处理

 error();

}

class RequestResult extends Result {

 List data = [];

 RequestResult(int code, String type, String msg, this.data)

 : super(code, type, msg);

 @override

 error() {

 print('$code 请求失败.');

  }

 @override

 success() {

 print('$code 请求成功. $data');

  }

}

class UpdateResult extends Result {

 UpdateResult(

 int code,

 String type,

 String msg,

  ) : super(code, type, msg);

 @override

 error() {

 print('$code 更新失败.');

  }

 @override

 success() {

 print('$code 更新成功');

  }

}

接口

抽象类中可以写一些普通方法,接口中的内容全部都是抽象的内容.不会有普通方法

使用 implements关键字,意味着实现对应的类,需要将里面所有的方法实现.

implements 可以一次实现多个类.

class Upload implements Result,A,B{}

代码语言:javascript
复制
class Upload implements Result {

 @override

 int code;

 @override

 String msg;

 @override

 String type;

 @override

 error() {}

 @override

 fetch() {}

 @override

 success() {}

}

混入

mixin关键字可以将类定义成可混入的类,其他类混入后可以使用其中的方法

with后加混入类.

class C with A,B{}

混入类不可以有构造函数 混入类不可以继承其他类 如果混入了两个类里有相同 方法,后来居上原则.调用方法调用的是后引入类的方法. 可以对混入的类中的方法进行重写

代码语言:javascript
复制
void main(List<String> args) {

 C c = C();

  c.a();

 print(c is A);// true

}

mixin class A {

 a() {

 print('a');

  }

}

mixin class B {

 b() {}

}

class C with A, B {}

泛型

泛型方法

(ps:基本上不会独立存在)

函数的返回类型,或者参数类型在调用函数的时候传入,更加灵活使用

代码语言:javascript
复制
void main(List<String> args) {

 List<String> list = ['23', '32'];

 print(getValue<String>('EW'));

 print(getValue<int>(2));

}

T getValue<T>(T value) {

 return value;

}

泛型类

泛型类定义类的类型。在创建实例的时候传入。

代码语言:javascript
复制
void main(List<String> args) {

 // 创建实例时传入类型

 Document<String> docs = Document({'title': 'title', 'content': 'content'});

  docs.setDocumet('editor', 'lisi');

 print(docs.getDocument('editor'));

 Document<List<String>> docs2 = Document({

 'title': ['title']

  });

  docs2.setDocumet('editor', ['lisi']);

 print(docs2.getDocument('editor'));

}

// 这里T是传入的类型。根据传入的T 来决定Map value 值的类型。

class Document<T> {

 Map<String, T> doc = {};

 Document(this.doc);

 setDocumet(String key, T value) {

    doc[key] = value;

  }

 T? getDocument(String key) {

 return doc[key];

  }

}

如果要实现一个类,传入类型后可以调用 Document 中的 getDocument 等方法,可以用泛型限定 传入的数据类型

代码语言:javascript
复制
void main(List<String> args) {

 List<String> list = ['23', '32'];

 print(getValue<String>('EW'));

 print(getValue<int>(2));

 Document<String> docs = Document({'title': 'title', 'content': 'content'});

  docs.setDocumet('editor', 'lisi');

 print(docs.getDocument('editor'));

 // var mark = Markdown(docs);

 // mark.init();

 Markdown<Document<String>> mark = Markdown(docs);

  mark.init();

}

// 复用上面的Document类

class Document<T> {

 Map<String, T> doc = {};

 Document(this.doc);

 setDocumet(String key, T value) {

    doc[key] = value;

  }

 T? getDocument(String key) {

 return doc[key];

  }

}

// 指定传入的类型需要时 Document<String>的实例

// 其中String 不可以用T 替换。否则创建实例会报错

class Markdown<T extends Document<String>> {

 T docs;

 Markdown(this.docs);

 init() {

 print(docs.getDocument('title'));

  }

}

泛型接口

只是在定义抽象类的时候在后面加上<T>传入类型,在继承抽象类是也需要 使用泛型

代码语言:javascript
复制
abstract class Catch<T> {

 T? getCatch(String key);

 setCatch(String key, T value);

}

class MameryCatch<T> extends Catch<T> {

 @override

 T? getCatch(String key) {

 return null;

  }

 @override

 setCatch(String key, T value) {

 print('set');

  }

}

自定义库

可以直接创建一个 dart 文件,写好内容

import '/xxx.dart 导入里面全部内容。

如果想指定方法导入 可是使用 show

import '/xxx.dart show A,B

指定某些内容不导入 用 hide 来指定不导入某些内容

import '/xxx.dart hide A,B

dart 内置库

dart:io dart:convert这里就是 dart 的内置库,提供了不同的方法。

三方库

查询的话 可以 使用 pub.dev 可以查询对应的三方库内容。

  • 创建一个 文件 pubspec.yaml
  • 必须要写的内容 name 和 环境
代码语言:javascript
复制
  name: 'app'

  environment:

  sdk: '^3.2.0'
  • 通过dart pub add 加库名称来安装库

dart pub add dio 后根据官方文档的示例来使用。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 抽象类
  • 多态
  • 接口
  • 混入
  • 泛型
    • 泛型方法
      • 泛型类
        • 泛型接口
          • 自定义库
            • dart 内置库
              • 三方库
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档