讓你看懂dart中靜態成員和繼承|8月更文挑戰

我的div丟了腫麼辦發表於2021-08-02

靜態屬性和靜態方法

在dart中,我們可以通過關鍵字
static來定義靜態屬性和靜態方法。

需要注意的是:
靜態方法不能訪問非靜態屬性【結論1】
非靜態方法可以訪問靜態成員【結論2】
我們通過下面的一段程式碼來解釋【結論1】和【結論2】

訪問靜態屬性或者呼叫靜態方法
直接通過類來訪問
複製程式碼

訪問靜態屬性和靜態方法

void main() {
  // 呼叫靜態方法
  PerSonInfo.showInfo();
  // 訪問靜態屬性
  print(PerSonInfo.name);
}

class PerSonInfo {
  static String name = '張三';
  int age;
  
  static void showInfo() {
     【結論1】
    // 會報錯,靜態方法中,不能夠訪問非靜態屬性
    // print(age);
    print(name);
  }

  // 非靜態方法中可以訪問靜態成員【結論2】
  show() {
    print('姓名$name');
    print('年齡$age');
  }
}
複製程式碼

級聯操作符 .. 的使用

void main() {
  var p = new PerSonInfo('張三', 10);
  // p.name = '李四';
  // p.age = 50;
  // p.show();
  
  //等價上面的程式碼
  p
    ..name = '李四'
    ..age = 50
    ..show();
}

class PerSonInfo {
  String name;
  int age;
  PerSonInfo(this.name, this.age);
  show() {
    print(this.name);
    print(this.age);
  }
}
複製程式碼

dart中的繼承

我們都知道dart一門物件導向的語言
那麼物件導向的語言中
有繼承、封裝、多型、這三個基本特徵

繼承:
子類使用extends關鍵字來繼承父類
子類會繼承父類中可見的屬性和方法
但是不會去繼承父類中的建構函式
子類是可以去重寫父類中的方法
複製程式碼
下面我們寫一個Grils類去繼承父類PerSonInfo
雖然Grils類中什麼都沒沒有寫
我們看一下是否可以繼承父類中的屬性和方法
複製程式碼
void main() {
  var g = new Grils();
  g.show();
}

class PerSonInfo {
  String name='張三';
  int age=10;
  show() {
    print(this.name);
    print(this.age);
  }
}
class Grils extends PerSonInfo {}

複製程式碼

繼承時需要注意的點

class PerSonInfo {
  String name = '張三';
  int age = 10;
  PerSonInfo(this.name,this.age);
  show() {
    print(this.name);
    print(this.age);
  }
}

//Grils 會報錯
//因為子類是不能夠去繼承父類中的構造方法的
class Grils extends PerSonInfo {}
複製程式碼
遇見的問題:
如果我們不要PerSonInfo類的建構函式
那麼這個PerSonInfo類只能夠輸出一個人的資訊
如何解決了
複製程式碼

子類呼叫父類的建構函式super

void main() {
  var g = new Grils('李四',30);
  g.show();
}

class PerSonInfo {
  String name = '張三';
  int age = 10;
  PerSonInfo(this.name,this.age);
  show() {
    print(this.name);
    print(this.age);
  }
}

class Grils extends PerSonInfo {
  //super我們可以理解為呼叫父類中的額構造並且賦值 
  Grils(String name, int age) : super(name, age);
}
複製程式碼

子類可以有自己的屬性和方法

void main() {
  var g = new Grils('李四', 30, '女');
  g.show();
  g.say();
}

class PerSonInfo {
  String name = '張三';
  int age = 10;
  PerSonInfo(this.name, this.age);
  show() {
    print(this.name);
    print(this.age);
  }
}

class Grils extends PerSonInfo {
  //子類中自己的屬性
  String sex;
  Grils(String name, int age, String sex) : super(name, age) {
    this.sex = sex;
  }
  
  //子類中自己的方法
  say() {
    print('你好呀');
  }
}

複製程式碼

優先呼叫子類方法的如果子類沒有在去找父類

void main() {
  var g = new Grils();
  g.say();//輸出  你好呀,我是子類
}

class PerSonInfo {
  say() {
    print('你好呀,我是父類');
  }
}

class Grils extends PerSonInfo {
  
  say() {
    print('你好呀,我是子類');
  }
}

複製程式碼

給命名建構函式傳遞引數

void main() {
  var g = new Grils('李四', 30, '女');
  g.show();
  g.say();
}

class PerSonInfo {
  String name = '張三';
  int age = 10;
  PerSonInfo(this.name, this.age);
  PerSonInfo.mingFun(this.name, this.age);

  show() {
    print(this.name);
    print(this.age);
  }
  say() {
    print('你好呀,我是父類');
  }
}

class Grils extends PerSonInfo {
  String sex;
  Grils(String name, int age, String sex) : super.mingFun(name, age) {
    this.sex = sex;
  }

  say() {
    print('你好呀,我是子類');
  }
}
複製程式碼

複寫父類中的方法

在專案的實際開發中
父類中的方法可能不在適用了
那麼這個時候我們可以重寫父類中的方法
重寫父類中的方法可以讓程式碼變得可以擴充套件
覆寫父類中的方法,不需要新增分號
@override
複製程式碼
void main() {
  var g = new Grils('李四', 30, '女');
  g.say();
}

class PerSonInfo {
  String name;
  int age;
  PerSonInfo(this.name, this.age);
  say() {
    print('你好呀,我是父類');
  }
}

class Grils extends PerSonInfo {
  String sex;
  Grils(String name, int age, String sex) : super(name, age) {
    this.sex = sex;
  }
  // 覆寫父類中的方法,不需要新增分號
  @override
  say() {
    print('你好呀,我是子類');
  }
}
複製程式碼

相關文章