面向 对象的四个特性抽象、继承、封装、多态
抽象
// 抽象
interface IStorage{
save(key:string,value:any):void
read(key:string):any
}
class UserInfo{
public name:string;
constructor(name:string,public storage:IStorage){
this.name=name
}
save(){
this.storage.save('userInfo',JSON.stringify(this))
}
read(){
return this.storage.read('userInfo')
}
}
class LocalStorage implements IStorage{
save(key: string, value: any): void {
localStorage.setItem(key,value)
}
read(key: string) {
return localStorage.getItem(key)
}
}
class MysqlStorage implements IStorage{
save(key: string, value: any): void {
// mysql.setItem(key,value)
}
read(key: string) {
// return mysql.getItem(key)
}
}
let local=new LocalStorage()
let userInfo=new UserInfo('zhufeng',local)
console.log(userInfo.name)
继承
export {}
// 继承主要是实现代码和逻辑的复用 或者属性和方法的复用
// 继承也会导致类的层次过深 类和类之间出现了耦合 如果修改父类子类也会跟着改变
class Animal{
name:string
eat(){
console.log('吃东西');
}
}
let animal=new Animal()
animal.eat()
class Dog extends Animal{
}
let dog=new Dog()
dog.name
dog.eat()
封装
// 封装 可以把内部属性隐藏起来 不让外部直接访问可以提供类的易用性
// 1 可以提供类易用性
// 2 可以保护类的隐私
export {
}
class Animal{
// public共有属性此属性可以在本类子类其他类访问
public name:string
// 受保护属性 可以在本类子类中访问
protected age:number
// 私有属性 只能在本类中访问
private weight:number
constructor(name: string,age: number,weight: number){
this.name=name
this.age=age
this.weight=weight
}
}
class Person extends Animal {
// 这是我的个人账户余额
private balance:number;
constructor(name:string,age:number,weight:number,balance:number){
super(name,age,weight)
this.balance=balance
}
}
let p1=new Person('zhufeng',10,100,1000)
p1.name
p1.age
p1.weight
多态
export {}
abstract class Animal{
abstract speak():void
}
class Dog extends Animal{
speak() {
console.log('汪汪汪');
}
}
class Cat extends Animal{
speak() {
console.log('喵喵喵');
}
}
function talk(animal:Animal){
animal.speak()
}
talk(new Dog())
talk(new Cat())