【Dart】类与方法-抽象类/接口/混入/泛型

抽象类
//1.抽象类必须通过abstract关键字声明
//2.抽象类中,可以有抽象方法,也可以没有抽象方法,一般来说,抽象类都有抽象方法
import 'package:my_flutter_app/15_metadata.dart';

abstract class Phone {
  //声明抽象方法。标记为手机处理器
  void processor();

  void camera(); //手机摄像头

  void info() {
    print('我是抽象类中的普通方法');
  }
}

class Huawei extends Phone {
  @override
  void camera() {
    print('莱卡888');
  }

  @override
  void processor() {
    print('888');
  }
}

class Xiaomi extends Phone {
  //普通类继承了抽象类,必须实现抽象类中的所有抽象方法
  @override
  void camera() {
    print('骁龙888');
  }

  @override
  void processor() {
    print('骁龙888');
  }
//普通类里面不能有抽象方法
// void aaa();
}

void main() {
  //抽象类不能被实例化
  // var p1 =new Phone();
  var p = new Xiaomi();
  p.camera();
  p.processor();
  p.info();
  var h = new Huawei();
  h.info();
  h.processor();
}

接口

  • 接口在Dart中就是一个类(只是用法不同)
    • 与java不同,java中的接口需要interface关键字声明;Dart中不需要
    • 接口可以是任意类,但一般使用抽象类做接口
  • 一个类可以实现(implements)多个接口,多个接口用逗号分隔
    • class MyClass implements Interface1,Interface2{...}
    • 接口可以看成是一个个小零件,类实现接口相当于组装零件
  • 普通类实现接口,必须重写接口中所有的属性和方法
//手机的处理器
import 'package:my_flutter_app/15_metadata.dart';

abstract class Processor {
  late String cores; //内核数 2核 4核
  arch(String name); //芯片制程 7nm 5nm

}

abstract class Camera {
  late String resolution; //分辨率 100万,3000万
  brand(String name); //品牌:三星,莱卡
}

//通过普通类是实现接口
class Phone implements Processor, Camera {
  @override
  String cores;

  @override
  String resolution;

  Phone(this.cores, this.resolution);

  @override
  arch(String name) {
    print('芯片制程:$name');
  }

  @override
  brand(String name) {
    print('相机品牌:$name');
  }
}

void main() {
  Phone p = new Phone('4核', '300万');
  p.arch('5nm');
  p.brand('莱卡');
}

``
### 混入
+ 混入(Mixin)是一段公共代码,混入有两种声明方式:
  + 将类当作混入`class MixinA{...}`
    + 作为Mixin的类只能继承来自Object,不能继承其他类
    + 作为Mixin的类不能有构造函数
  + 使用mixin关键字声明`mixin MixinB{...}`
+ 混入(Mixin)可以提高代码复用率,普通类可以通过`with`来使用混入
  ``` class MyClass with MixinA , MixinB{...} ```
+ 使用多个混入时,后引入的混入会覆盖之前混入中的重复内容
  + MixinA 和 MixinB 中都有hello()方法,MyClass 会使用 MixinB中的

import 'package:my_flutter_app/Father.dart';

// class MixinA extends Object{
// class MixinA extends Father{
class MixinA {
String name = 'MixinA';
//用作混入的类不能拥有构造函数
MixinA();
void printA() {
print('A $name');
}

void run() {
print('A is runing');
}
}

class MixinB {
String name = 'MixinB';

void printB() {
print('B $name');
}

void run() {
print('B is runing');
}
}

class MyClass with MixinA, MixinB {}

void main() {
var c = new MyClass();
//后引入的混入,会覆盖之前引入的混入中的重复的内容
c.printA();
c.printB();
c.run();
}

### 泛型
![泛型](https://upload-images.jianshu.io/upload_images/564272-a6818884d2917dfb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

![泛型](https://upload-images.jianshu.io/upload_images/564272-5901d38d09299e97.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
### 泛型函数

// String getData(String value) {
// return value;
// }

// int getData(int value) {
// return value;
// }
//不指定数据类型的函数,
// getData(value) {
// return value;
// }
// T getData<T>(T value) {
// return value;
// }
//只约定参数类型,不约定函数返回值的类型
getData<T>(T value) {
return value;
}

void main() {
// getData('');
print(getData<String>('hello'));
print(getData<int>(111));
}

### 泛型类

class CommonClass {
Set s = new Set<int>();

void add(int value) {
this.s.add(value);
}

void info() {
print(this.s);
}
}

class GenericsClass<T> {
Set s = new Set<T>();

void add(T value) {
this.s.add(value);
}

void info() {
print(this.s);
}
}

void main() {
CommonClass c = new CommonClass();
c.add(1);
// c.add('2');
c.info();
GenericsClass g = new GenericsClass<String>();
g.add('hello');
g.info();
GenericsClass g1 = new GenericsClass<int>();
g1.add(123);
g1.info();

// Set s=new Set();
// s.add(123);
// s.add('value');
// print(s);

Set s = new Set<int>();
s.add(123);
// s.add('value');
print(s);
//字面量形式的泛型
Set set = <int>{};
set.add(1);
}

### 泛型接口
![image.png](https://upload-images.jianshu.io/upload_images/564272-c9dde57642602540.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
## 使用泛型限制参数类型

class SomeBaseClass {}

class AnotherClass {}

class Extender extends SomeBaseClass {}

class Foo<T extends SomeBaseClass> {
String toString() => "Instance of 'Foo<$T>'";
}

void main() {
var someBaseClassFoo = Foo<SomeBaseClass>();
print(someBaseClassFoo.toString());
// var anotherClass = Foo<AnotherClass>();//报错
// print(anotherClass.toString());
var extenderFoo = Foo<Extender>(); //子类也可
print(extenderFoo.toString());
var no = Foo(); //不写默认
print(no.toString());
}

> 下一节`枚举`







`
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容