抽象類
所謂抽象類,是指用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中接口是一個很靈活的概念,他可以定義對象類型,函數類型,類類型,還可以定義屬性隻讀,屬性可選等操作。
- 屬性接口
通過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文法為基礎,展開講述了在面向對象中的兩大知識點:抽象類與接口。同時,對抽象類和方法進行了對比,找出了兩者之間的異同之處。