美文网首页中交Flutter小组
Dart基础--Class类及泛型

Dart基础--Class类及泛型

作者: 小宁子呀 | 来源:发表于2019-11-12 10:43 被阅读0次

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

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{如有问题欢迎积极探讨}}

相关文章

网友评论

    本文标题:Dart基础--Class类及泛型

    本文链接:https://www.haomeiwen.com/subject/avsfictx.html