Dart基础--Class类及泛型

一.类的组成部分及调用方式

class Person{
  //声明变量类型
  String name;
  int age;
  String sex;
  //默认构造函数最初写法
  Person (String name,int age,String sex){
    print("默认构造函数函数体里的打印");
  }
  //默认构造函数简写,可以使用this(和上面构造函数二选一,推荐简写)
  Person({this.name,this.age,this.sex});
  //命名构造函数
  Person.now(){
    print('命名构造函数now的函数体打印');
 }
  //类的普通方法(void表示函数没有返回值)
  void printInfo(){
    print("类的printInfo方法::${this.name}--${this.age}--${this.sex}");
 }
  //setter方法,关键字set声明的方法,一般用于设置单个属性值
  set setInfo(String name){
    this.name=name;
  }
  //getter方法,关键字get声明的方法,一般用来获取类的某些属性
  get getInfo{
    return "getter方法::${this.name}--${this.age}--${this.sex}";
  }
}

void main(){
  Person p1=new Person('张三',20,'man');//实例并调用类的默认构造函数
  Person p2=new Person.now();//实例并调用类的命名构造函数
  p1.printInfo();//调用printInfo方法
  p1.setInfo="李四";//调用set方法重写属性
  print(p1.getInfo);//打印get方法拿到的数据
}

二.extends继承、覆写父类方法及super关键字

//父类 Person
class Person {
  String name;
  int age;
  Person(this.name,this.age);
  Person.now(){
    print('now');
  }
  printInfo(){
    print("父类方法::$name--$age");
  }
}
//子类 Son
class Son extends Person {
  String sex;
  //继承父类属性并将实例化时传来的sex赋值到this.sex
  Son(String name,int age,String sex):super(name,age){
    this.sex=sex;
  }
  run(){
    super.printInfo();//调用父类方法-使用super.方法名()
    print(this.name);//调用父类属性-使用this.
  }
  @override   //覆写父类同名方法约定使用@override标注
  printInfo() {
    print("此方法覆写父类同名方法::$name--$age");
  }
}

void main(){
  Son s1=new Son("王五",23,"女");
  s1.run();
  s1.printInfo();
}

三.abstract抽象类

  • 特点:
    1.使用abstract关键字定义一个抽象类
    2.定义方法不实现,让子类去实现
    3.不可直接实例抽象类--调用时体现
  • 应用场景:定义一个类的标准,适用于定义接口
abstract class Animal {
  eat();
  run();
}

class Dog extends Animal {
  eat(){
    print('Dog--eat');
  }
  run(){
    print('Dog--run');
  }
}

void main(){
  // var a1=new Animal(); //不可直接实例抽象类
  Dog d1=new Dog();//可以实例继承抽象方法的子类
  d1.eat();
  d1.run();
}

四.Mixin混入

  • 特点:(配合代码理解)
    1.作为被Son继承的mixin类 只可以继承自Object类 不可继承自其它类
    2.作为被Son继承的mixin类 不可有构造函数
    3.继承多个类重复的方法,后面覆盖前面的处理方式
    4.继承后的Son子类is类型检测时 同属于A,B,Person 结果都为true
    5.mixin不是继承 不是接口 是新特性
  • 应用场景:可实现多继承
class Person {
  String name;
  Person(this.name);
  printInfo(){
    print("${this.name}");
  }
}

// class A extends Person{ //错误代码:作为被Son继承的mixin类 只可以继承自Object类 不可继承自其它类
//   A(String name):super(name); //错误代码:作为被Son继承的mixin类 不可有构造函数            
//   printInfo(){
//     print("${this.name}");
//   }
// }

class A {
  printInfo(){
    print("A");
  }
}

class B {
  printInfo(){
    print("B");
  }
}

class Son extends Person with A,B {//with后的A、B两个类以mixin形式被继承
  Son(String name):super(name);
}

void main(){
  Son s1=new Son('我是abc');
  s1.printInfo();//打印字符串B
}

五.接口

abstract class Db1 {
  add();
}

abstract class Db2 {
  save();
}

class Mysql implements Db1,Db2 { //多个接口应用场景 使用implements接口1,接口2......
  @override
  add() {
    print('add');
  }
  save() {
    print('save');
  }
}

void main(){
  Mysql m1=new Mysql();
  m1.add();
  m1.save();
}

六.类设置初始变量值

class Person {
  String name;
  int age;
  Person():name="张三",age=21{

  }
  printInfo(){
    print("${this.name}--${this.age}");
  }
}

void main(){
  Person p1=new Person();
  p1.printInfo();//张三--21
}

七.类的静态属性

//使用static关键字声明的属性和方法视为静态成员
class Person {
  String name;
  int age;
  static String sex="女";
  Person(this.name,this.age);
  printInfo(){
    print(this.name);
  }
  printInfo2(){
    print(sex);//非静态方法可以访问静态成员
  }
  static void staticfn(){
    print(name);//静态方法不可以访问非静态成员
  }
  static void staticfn2(){
    print(sex);
  }
}

void main(){
  Person p1=new Person("张三",20);
}

八.类的私有属性

  • 实现私有的条件:
    1.私有成员声明时变量名前要有_
    2.将带有私有成员的类分离出去
//存放私有属性方法的private.dart文件
class Person {
  String name;
  int age;
  String _sex;//私有属性
  Person(this.name,this.age,this._sex);
  myfn1(){
    print('myfn1');
  }
  _myfn2(){//私有方法
    print('myfn2');
  }
  getSelfValue(){//普通方法抛出私有属性
    return this._sex;
  }
  getSelfFn(){//普通方法调用私有方法
    return this._myfn2();
  }
}
//要调用私有成员的文件
import 'libs/private.dart';
void main(){
  Person p1=new Person("张三",20,"男");
  //实例可以访问普通属性、方法
  print(p1.name);
  p1.myfn1();
  //实例不可以访问私有属性、方法
  // print(p1._sex);
  // p1._myfn2();
  //为了可以访问私有属性 调用普通方法抛出私有属性
  print(p1.getSelfValue());
  //为了可以访问私有方法 调用普通方法抛出私有方法
  p1.getSelfFn();
}

九.泛型

//泛型类
class Person<N,A> {
  N name;
  A age;
  Person(this.name,this.age);
  set setInfo(N n){   //调用此方法必须传入N类型数据
    this.name=n;
  }
  get getInfo{
    return "{name:${this.name},age:${this.age}}";
  }
}

void main(){
  Person p1=new Person<String,int>('张三', 111);
  p1.setInfo='李四';
  print(p1.getInfo);//name:李四,age:111
}
//泛型方法
T getData1<T>(T name){ //校验返回类型
  return name;
}

getData2<T>(T name){  //不校验返回类型
  return 123;
}

void main(){
  print(getData1<String>("张三"));
  print(getData2<String>("张三"));
}
//泛型接口
abstract class Person<T> {
  getValue(String key);
  setValue(String key,T value);
}

class Man<T> implements Person<T> {
  @override
  getValue(String key) {
    return null;
  }
  @override
  setValue(String key,T value) {
    print("Man--设置$key=$value");
  }
}

class Woman<T> implements Person<T> {
  @override
  getValue(String key) {
    return null;
  }
  @override
  setValue(String key,T value) {
    print("Woman--设置$key=$value");
  }
}

main(){
  Person p1=new Man<int>();//实例时尖括号传入类型
  p1.setValue("键值", 111);//调用对应方法按照声明时一致类型传入即可
}

十.库的使用

// 1.自定义库 使用import "libs/selfApi.dart";   直接调用即可
// 2.引入dart的内置库 使用import "dart:io";     直接调用即可
// 3.引入第三方库
// (1).找到你要用的库  https://pub.dev/packages
// (2).创建一个pubspec.yaml配置文件     name--名称  description--描述   dependencies--依赖的库:版本
// (3).终端运行pub get下载依赖库
// (4).看文档按照指定方式具体使用

卡布奇诺、
\color{green}{\Large\mathbf{如有问题欢迎积极探讨}}

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

推荐阅读更多精彩内容

  • 面向对象编程(OOP) 在前面的章节中,我们学习了Kotlin的语言基础知识、类型系统、集合类以及泛型相关的知识。...
    Tenderness4阅读 4,431评论 1 6
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 2,643评论 0 11
  • 1.import static是Java 5增加的功能,就是将Import类中的静态方法,可以作为本类的静态方法来...
    XLsn0w阅读 1,219评论 0 2
  • 面向对象主要针对面向过程。 面向过程的基本单元是函数。 什么是对象:EVERYTHING IS OBJECT(万物...
    sinpi阅读 1,048评论 0 4
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 2,373评论 0 4