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
}

七.類的靜態(tài)屬性

//使用static關鍵字聲明的屬性和方法視為靜態(tài)成員
class Person {
  String name;
  int age;
  static String sex="女";
  Person(this.name,this.age);
  printInfo(){
    print(this.name);
  }
  printInfo2(){
    print(sex);//非靜態(tài)方法可以訪問靜態(tài)成員
  }
  static void staticfn(){
    print(name);//靜態(tài)方法不可以訪問非靜態(tài)成員
  }
  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).創(chuàng)建一個pubspec.yaml配置文件     name--名稱  description--描述   dependencies--依賴的庫:版本
// (3).終端運行pub get下載依賴庫
// (4).看文檔按照指定方式具體使用

卡布奇諾、
\color{green}{\Large\mathbf{如有問題歡迎積極探討}}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 面向對象編程(OOP) 在前面的章節(jié)中,我們學習了Kotlin的語言基礎知識、類型系統(tǒng)、集合類以及泛型相關的知識。...
    Tenderness4閱讀 4,628評論 1 6
  • 一:java概述:1,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境,java的開發(fā)工...
    ZaneInTheSun閱讀 2,823評論 0 11
  • 1.import static是Java 5增加的功能,就是將Import類中的靜態(tài)方法,可以作為本類的靜態(tài)方法來...
    XLsn0w閱讀 1,443評論 0 2
  • 面向對象主要針對面向過程。 面向過程的基本單元是函數。 什么是對象:EVERYTHING IS OBJECT(萬物...
    sinpi閱讀 1,228評論 0 4
  • 一、基礎知識:1、JVM、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機...
    殺小賊閱讀 2,576評論 0 4

友情鏈接更多精彩內容