什么是OOP(面向对象编程)

126 阅读1分钟

面向 对象的四个特性抽象、继承、封装、多态

抽象


// 抽象
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())