[Day16]:大部分解 - class X interface
大部分解開始~
清槍開始、清槍蹲下將槍枝斜舉於左胸膛,檢視藥室內有無子彈───────────────────────── By TW 國軍
目標:Interface(介面)
& Class(類別)
的組合技
昨天提到,
Interface(介面)
另一個主要的功能是: 對Class(類別)
的功能做抽象,抽象幹嘛? 這樣其他人就可以重複使用他, 這是OOP(物件導向)
的一大特性。
過程:
Implements(實現)
一般來說
Class(類別)
只會繼承另一個Class(類別)
, 但是有些時候,不同產線上的Class(類別)
會有相同的需求, 這時候就會利用Interface(介面)
把那個功能抽象化。typescriptinterface iSummary { getSummary(): string; } class Member { title: string ; age: number; constructor(title: string = 'nobody', age: number = 0) { this.title = title; this.age = age; } } class SuperMember extends Member implements iSummary{ private weight: number; constructor(title: string, age: number, weight: number = 100) { super(title, age); this.weight = weight; } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22沒錯,就是這麼簡單明瞭,在你的
Class(類別)
後面, 告訴他你要Implements(實現)
什麼功能就可以了, 但是可不能光說不練,你說了你想做什麼,你就需要真的做才可以。 上面這個範例TS是會警告的他會告訴你:沒有實做getSummary。typescriptgetSummary = () => { return `${this.title} is ${this.age} years old.`; }
1
2
3需要把上面這個function實做出來才可以喔~ 當然 就像
extends(繼承)
一樣implements(實現)
也可以實現多個, 用,隔開就可以了:typescriptclass SuperMember extends Member implements iSummary, iAge{
1
Interface extends(介面繼承)
ㄟㄟ? 怎麼回頭講
Interface(介面)
了? 沒錯 之前還沒有講過Interface extends(介面繼承)
現在剛好補充起來:typescriptinterface iAge { convertAge(): string; } interface iSummary extends iAge{ getSummary(): string; }
1
2
3
4
5
6
7說穿了也沒什麼,其實跟我們上一章裡的
extends(繼承)
用法一樣。
Interface(介面)
繼承Class(類別)
沒錯,前面說TS的
Interface(介面)
極度靈活, 他就是可以靈活成這樣:typescriptclass Member { title: string = 'nobody'; age: number = 0; } interface iMember extends Member { weight: number; } let Opshell: iMember = { weight: 60 }
1
2
3
4
5
6
7
8
9
10雖然這樣做很奇怪,不知道為啥要這樣弄就是了, 如果有實際的使用其情況,請大大不吝嗇留言, 感恩~
Hybrid face(混和模式)
又是混合模式,透過這次講OOP Class 我們來好好複習霧煞煞的混合模式, 使用
Interface(介面)
的方式來定義一個Function(函式)
需要符合的Shape(形狀)
:typescriptinterface Member { (title: string, age: number | string): string; } let Opshell: Member = (title, age) => `${title} is ${age} years old.`;
1
2
3
4
5然後對她做混合:
typescriptinterface Member { (title: string, age: number | string): string; // 函式的In Out weight: number; // 函式裡的屬性 getWeight(e: {weight: number}): void; // 函式裡的方法 } function creatMember(): Member { // 在這邊不能用箭頭函式表達喔 let member = <Member>function (title: string, age: number): string { return `${title} is ${age} years old.`; } member.weight = 100; member.getWeight = (e: {weight: number}) => { console.log(e.weight) }; return member; } let Opshell = creatMember(); console.log(Opshell('Opshell', 30)); Opshell.weight = 60; console.log(Opshell.getWeight(Opshell));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22過了幾個章節回來看混合模式, 有沒有更理解了? 對Ops來說 混合模式感覺像簡易版的
Class(類別)
,Class(類別)
可以做到混合模式在做的全部事情,甚至更靈活, 所以一般有這種需求,應該都會使用Class(類別)
實做吧, 如果有什麼Hybrid(混合模式)
是更優解的情況, 再請大大補充,讓小弟學習= 口=
小結:
寫到這邊,
Interface(介面)
、Class(類別)
和Function(函式)
, 之間的關係清楚了很多,混合模式也也能得比較清楚, 可以看出來,他們之間的交互可以很自由。 要炫技可以炫到眼花= 口= 身為菜鳥的Ops稍微了解一下就好, 等等迷路。