摘要:二正文中與的區(qū)別接口只聲明成員方法,不做實現(xiàn)。在中,我們可以采用全新的基于類繼承的模式設(shè)計更優(yōu)雅的語義化接口,這是因為中的可以繼承動態(tài)構(gòu)造的類,這一點和其他的靜態(tài)聲明類的編程語言不同。
一 前言
1.在typescript上遇到過實例化對象的兩種寫法:implement和extends。extends很明顯就是ES6里面的類繼承,那么implement又是做什么的呢?它和extends有什么不同?
2.還有一個問題就是:typescript 有接口的概念,這個接口和類有什么關(guān)系嗎?
帶著以上兩個問題我們一起看一下這篇文章。
二 正文 1.ts中interface與class的區(qū)別interface:接口只聲明成員方法,不做實現(xiàn)。
class:類聲明并實現(xiàn)方法。
也就是說:interface只是定義了這個接口會有什么,但是沒有告訴你具體是什么。
例如:
interface Point { lng:number; lat:number; sayPosition():void; }
Point interface 里面包含數(shù)值類型的經(jīng)緯度和一個sayPosition函數(shù),但是具體內(nèi)容沒有定義,需要你自己在子類中實現(xiàn)。
而class則是完整的實現(xiàn):
class Point { constructor(lng,lat){ this.lng = lng; this.lat = lat; } sayPosition(){ console.log("point:",this.lng,this.lat); } }2.extends 與 implement
(1)extends是繼承父類,只要那個類不是聲明為final或者那個類定義為abstract的就能繼承。
(2)java中不支持多重繼承,但是可以用接口來實現(xiàn),這樣就要用到implements,繼承只能繼承一個類,但implements可以實現(xiàn)多個接口,用逗號分開就行了
比如:
class A extends B implements C,D,E
在英文中:
implements 就是:實現(xiàn)的意思。
“implement是實現(xiàn)一個接口,要自己實現(xiàn)這個接口的方法”
implements就是實現(xiàn)的意思,顧名思義它實現(xiàn)一個已經(jīng)定義好的接口中的方法!如:
public interface MyInterface{ public String MyInterfaceMethod1ToReturnString(); public void MyIntefaceMethod2(); ...... //在這里定義一系列不需要實現(xiàn)的方法,其實現(xiàn)過程"延續(xù)到"他的子類中 }
實現(xiàn)接口方法:
public MyImplClass implements MyInterface{ public String MyInterfaceMethod1ToReturnString(){ return "My String here!"; } public void MyIntefaceMethod2(){ //Do something else here! } }3.ES6中使用Mixin實現(xiàn)“多重繼承”
熟悉 JavaScript 的同學(xué)應(yīng)該對 mixin 模式并不陌生。我們說 JavaScript / ES5 的繼承模型是基于單一原型鏈的繼承模型,通常情況下,在 JavaScript 實踐中完全用原型鏈來實現(xiàn)繼承式的代碼復(fù)用,是遠遠不能滿足需求的。因此實戰(zhàn)中,我們的代碼抽象基本上都是采用混合的模式,既有原型繼承,也有 mixin 組合。
在 ES6 中,我們可以采用全新的基于類繼承的 “mixin” 模式設(shè)計更優(yōu)雅的“語義化”接口,這是因為 ES6 中的 extends 可以繼承動態(tài)構(gòu)造的類,這一點和其他的靜態(tài)聲明類的編程語言不同。
const Serializable = Sup => class extends Sup { constructor(...args){ super(...args); if(typeof this.constructor.stringify !== "function"){ throw new ReferenceError("Please define stringify method to the Class!"); } if(typeof this.constructor.parse !== "function"){ throw new ReferenceError("Please define parse method to the Class!"); } } toString(){ return this.constructor.stringify(this); } } class Person { constructor(name, age, gender){ Object.assign(this, {name, age, gender}); } } class Employee extends Serializable(Person){ constructor(name, age, gender, level, salary){ super(name, age, gender); this.level = level; this.salary = salary; } static stringify(employee){ let {name, age, gender, level, salary} = employee; return JSON.stringify({name, age, gender, level, salary}); } static parse(str){ let {name, age, gender, level, salary} = JSON.parse(str); return new Employee(name, age, gender, level, salary); } } let employee = new Employee("jane",25,"f",1,1000); let employee2 = Employee.parse(employee+""); //通過序列化反序列化復(fù)制對象 console.log(employee2, employee2 instanceof Employee, //true employee2 instanceof Person, //true employee == employee2); //false
在上面的代碼里,我們改變了 Serializable,讓它成為一個動態(tài)返回類型的函數(shù),然后我們通過 class Employ extends Serializable(Person) 來實現(xiàn)可序列化,在這里我們沒有可序列化 Person 本身,而將 Serializable 在語義上變成一種修飾,即 Employee 是一種可序列化的 Person。
三 后記參考鏈接:
Classes
類的裝飾器:ES6 中優(yōu)雅的 mixin 式繼承
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/95321.html
摘要:在抽象類中,聲明的是,可是。抽象類只能作為子類的超類,子類繼承抽象類時必須被實現(xiàn)。它根本不存在方法的實現(xiàn)實現(xiàn)子類使用關(guān)鍵字來繼承抽象類。添加新方法如果你往抽象類中添加新的方法,你可以給它提供默認(rèn)的實現(xiàn)。轉(zhuǎn)自,抽象類與接口的區(qū)別 抽象類與接口 抽象類與接口一樣,都不能被實例化,可以有具體實現(xiàn)的方法,也可以有抽象的方法。在抽象類中,聲明的field是static、final,method可...
摘要:前言是面對對象的語言,因此有必要單獨紀(jì)錄下對象的各種定義和理解。面對對象基本概述概述是基于面向過程的變成思想,是對面向過程的一種封裝。面對對象開發(fā)就是不斷的創(chuàng)建對象,使用對象,指揮對象做事情。面對對象設(shè)計其實就是在管理和維護對象之間的關(guān)系。 前言 java是面對對象的語言,因此有必要單獨紀(jì)錄下對象的各種定義和理解。 面對對象,主要包括:面向?qū)ο笏枷耄惻c對象及其使用,對象的內(nèi)存圖,成...
摘要:很多常見的面試題都會出諸如抽象類和接口有什么區(qū)別,什么情況下會使用抽象類和什么情況你會使用接口這樣的問題。在討論它們之間的不同點之前,我們先看看抽象類接口各自的特性。抽象類抽象類是用來捕捉子類的通用特性的。 很多常見的面試題都會出諸如抽象類和接口有什么區(qū)別,什么情況下會使用抽象類和什么情況你會使用接口這樣的問題。本文我們將仔細(xì)討論這些話題。 在討論它們之間的不同點之前,我們先看看抽象類...
摘要:抽象類和接口抽象類抽象方法是只有方法簽名,沒有方法實現(xiàn)的方法。抽象類不能被實例化,抽象類可以包含方法抽象和普通成員變量構(gòu)造器初始化塊內(nèi)部類接口枚舉種成分。抽象類的構(gòu)造器不能用于創(chuàng)建實例,主要用于被其子類調(diào)用。 抽象類和接口 1.抽象類 抽象方法是只有方法簽名,沒有方法實現(xiàn)的方法。有抽象方法的類只能被定義成抽象類,抽象類可以沒有抽象方法。抽象方法和抽象類必須使用abstract修飾符來定...
摘要:抽象類支持抽象類和抽象方法。接口是一種特殊的抽象類,這種抽象類中只包含抽象方法和靜態(tài)常量。對抽象類的使用是通過關(guān)鍵字。抽象類中可以聲明各種類型成員變量,實現(xiàn)數(shù)據(jù)的封裝。一個類可以同時實現(xiàn)多個接口,但一個類只能繼承于一個抽象類。 抽象類 php5支持抽象類和抽象方法。類前加 abstract, 此類就成為抽象類,無法被實例化,此類天生就是用來被繼承的,給子類提供了一個類的模板;類方法前加...
閱讀 2812·2021-10-14 09:42
閱讀 3619·2021-10-11 10:59
閱讀 2952·2019-08-30 11:25
閱讀 3088·2019-08-29 16:25
閱讀 3233·2019-08-26 17:40
閱讀 1241·2019-08-26 13:30
閱讀 1155·2019-08-26 11:46
閱讀 1337·2019-08-23 15:22