天天看點

Typescript:抽象類與接口

抽象類

所謂抽象類,是指用abstract修飾的類。抽象類是不完整的,它隻能作為基類,不能夠被執行個體化。簡而言之,抽象類本身不做任何事情,他是去要求别人來實作自己的規範。它定義了一組抽象方法,至于抽象方法的實作則交由它的子類來完成。

  • 抽象類特點
1.抽象類隻是一個引用而已,不能被執行個體化,執行個體化的工作要交給它的子類;
2.抽象方法必須由子類來進行重寫;
3.在一個類中,隻要有一個方法被定義為抽象方法,那麼這個類就必須被定義為抽象類,若子類沒有重寫父類全部的抽象方法,則必須為抽象類。 
4.抽象類中可以包含具體方法,也可以不包含;
5.子類中的抽象方法不能與父類的抽象方法同名;
6.不能用abstract修飾變量、代碼塊、構造器; 
7.不能用abstract修飾私有方法、靜态方法、final的方法、final的類           
  • 文法
abstract class 類名 {
  
  屬性名:類型;
  
  constructor(參數:類型) {
    this.屬性名 = 參數
  }
  
  abstract 方法名():類型;
}

class 子類 extends 父類{
  
  子類特有屬性:類型;
  
  //子類構造函數
  constructor(參數1:類型,參數2:類型,參數3:類型){
    //super可以用來調用父類的屬性,方法和構造函數
    super(參數1,參數2); //調用父類構造函數
    this.屬性名 = 參數3
  }
  
  //一定要實作父類有的抽象方法,否則會報錯
  父類方法名(){
    ……
    }
}           
  • 執行個體展示
abstract class Person {
  
  name:string;
  age:number;
  
  constructor(name:string,age:number) {
    this.name = name
    this.age = age
  }
  
 abstract sayHi():void;
}

class Chinese extends Person{
  
  country:string;
  
  constructor(name:string,age:number,country:string){
    super(name,age);
    this.country = country
  }
  
  //實作了父類的抽象方法
  sayHi(){
    console.log(`${this.name}說了聲你好`)
  }  
}           

接口

在在面向對象語言中,接口是一個重要的概念。它是對行為的抽象,而具體如何星鬥則交由類來實作。而在TS中接口是一個很靈活的概念,他可以定義對象類型,函數類型,類類型,還可以定義屬性隻讀,屬性可選等操作。

Typescript:抽象類與接口
  • 屬性接口

通過interface關鍵字就定義一個接口,接口裡面是的屬性類型的限制。在不添加特殊辨別的時候,當我們将接口作為一個變量的類型的時候,該變量必須将接口裡面的屬性完整定義否則會報錯。

  • 文法
interface 接口名{
  屬性名:類型
  
  //屬性前添加readonly表示該屬性是隻讀屬性,無法更改
  readonly 屬性名:類型
  
  //屬性後面添加?表示該屬性為可選屬性,可添加也可以不添加
  屬性名?:類型
}
           
  • 執行個體
interface Student{
  
  name:string
  age:number
	
  //屬性前添加readonly表示該屬性是隻讀屬性,無法更改
  readonly score:number
  
  //屬性後面添加?表示該屬性為可選屬性,可添加也可以不添加
  sex?:string
}

let stu: Student = {
  name:"吳名小卒",
  age:18,
  score:99
}

stu.age = 20
console.log(stu)
  
stu.score = 100  //報錯,score是隻讀屬性,不能更改數值
           
  • 函數接口

函數接口主要分為函數屬性接口和函數類型接口兩種。兩種接口針對函數的不同方面進行了限制。

1、函數屬性接口:用于限制函數的參數和傳回值的類型
2、函數類型接口:用于限制函數的類型           
  • 文法
// 函數屬性接口文法
interface 接口名{
  屬性名:類型
  屬性名:類型
}

function 函數名(參數名:接口名):傳回值類型{
  ……
}

// 函數類型接口文法
interface 接口名{
  (屬性名:類型,屬性名:類型):傳回值類型
}

const 函數名:接口名 = (屬性名,屬性名) =>{
  ……
}           
  • 執行個體
//函數屬性接口
interface Params{
  a:number
  b:number
}

function sum(params:Params):number{
  return params.a + params.b
}

//函數類型接口
interface Sum{
  (params:Params):number
}

const sub:Sum = (params) =>{
  return params.a - params.b
}

console.log(sum({a:2,b:1}))   //3
console.log(sub({a:2,b:1}))   //1           
  • 類類型接口

類類型接口主用于限制類中的内容,類類型接口有點類似于抽象類,在接口中定義類的公共屬性和方法,但都沒有實作,具體實作交由類來完成。類通過implement關鍵字來實作接口,并在類中實作接口中所有非可選的方法。

  • 文法:
interface 接口名{
  屬性名:類型;
  屬性名:類型;
  
  方法名(參數:類型):傳回值類型;
}

class 類名 implements 接口名{
  
  接口屬性:類型;
  接口屬性:類型;
  屬性:類型;
  
  接口方法(參數:類型){
    ……
  }
}           
  • 執行個體
interface People{
  name:string;
  age:number;
  
  sayHi():void;
}

class Man implements People{
  name:string;
  age:number;
  sex = "男";
  
  constructor(name:string,age:number){
    this.name = name;
    this.age = age;
  }
  sayHi(){
    console.log("你好!!");
  }
}           

抽象類和接口的對比

1、抽象類當作父類,被繼承。而且抽象類的子類的構造函數必須調用super()。而接口可以作為子類繼承其他的類;
2、抽象類和接口都無法被執行個體化。
3、抽象類中除了抽象方法之外,其餘函數能包含具體實作,而接口中不包含具體實作。
4、抽象類所有的抽象方法在子類中都必須被實作,接口中的非可選方法在接口被調時也都要實作。
5、抽象類的方法可以被當成類的執行個體方法,被通路修飾符修飾。但接口不行。           

總結

本篇文章主要以TS文法為基礎,展開講述了在面向對象中的兩大知識點:抽象類與接口。同時,對抽象類和方法進行了對比,找出了兩者之間的異同之處。

繼續閱讀