Ts面向对象

Ts面向对象

面向对象:把数据及对数据的操作方法放在一起,作为一个相互依存的整体——对象。对同类对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。程序流程由用户在使用中决定。对象即为人对各种具体物体抽象后的一个概念,人们每天都要接触各种各样的对象,如手机就是一个对象。

class Person{
    name:string = '孙悟空';
    static age:number = 18
    readonly gender:string = '男'
    sayHello(){
        console.log("说你好!")
    }
    static  sayHello(){
        console.log("说你好!")
    }
}
const per = new Person
console.log(per.name)  //实例化对象进行访问
console.log(Person.age)//仅仅静态类型可以通过类进行访问
console.log(per.gender)//增加只读属性后只能对属性进行读取,而不能进行更改
per.sayHello();  //在使用方法时后使用实例和使用类是一样的
Person.sayHello(); 
构造函数和this
class Dog{
 constructor(name:string,age:number){
     console.log(this)
     this.name = name;
     this.age = age;
 }
    
}
let dog1 = new Dog();  //每一个实例中实例就是构造函数中的this,简而言之就是当前对象
//当new dog()时候相当于调用了构造函数,也就是实例是从类中延申出来的

继承

class Animal{
   constructor(name:string,age:number){
     console.log(this)
     this.name = name;
     this.age = age;
 }
    sayHello(){
        console.log("动物在叫!")
    }
}
class Dog extends Animal{   //实际上就是扩展继承过后animal所有的属性dog都包含
   run(){
       console.log("我在跑~")
   }
}
//如果想在子类中增加父类中没有的属性直接添加即可
//仅仅这样继承满足不了需求这样无论怎么调用sayHello方法都会输出动物在叫
class Dog extends Animal{   //实际上就是扩展继承过后animal所有的属性dog都包含
    sayHello(){
        console.log("喵喵喵") //在继承中对方法进行重写可以将父类的方法进行覆盖
    }
}

super关键字

//super相当于父类
//主要的运用场景是向子类中增加一些属性,如果在子类中写了构造函数,必须调用父类的构造函数
class Animal{
   constructor(name:string,age:number){
     console.log(this)
     this.name = name;
     this.age = age;
 }
    sayHello(){
        console.log("动物在叫!")
    }
}
class Dog extends Animal{   //实际上就是扩展继承过后animal所有的属性dog都包含
    constructor(name:string,age:number,gender:string){
     super(name,age)   
     console.log(this)
     this.name = name;
     this.age = age;
     this.gender = gender   
 }
   run(){
       console.log("我在跑~")
   }
}

抽象类

abstract  class Animal{    //以abstract开头的类为抽象类,只不过不能用来创建实例对象,(仅仅为了给别人当爸爸)
   constructor(name:string,age:number){
     console.log(this)
     this.name = name;
     this.age = age;
 }
    abstract sayHello():void  //抽象方法只能定义在抽象类中,在继承中会强制重写抽象方法
}

接口(Ts特有)

//接口迎来定义一个类的结构,用来定义类中应该包含哪些属性和方法
interface myInterface{
    name:string
    age:number
}
interface myInterface{
    gender:string
}
//接口重名是合法的调用时候相当于内容的相加
//接口可以在定义时候限制类的结构
//接口中所有的属性不能有实际的值
//接口只定义对象的结构而不考虑实际的值
//在接口中所有的方法都是抽象方法 
//定义类可以实现一个接口(就是类要满足接口的要求)
class Myclass implements myInterface{
     constructor(name:string,age:number){
     console.log(this)
     this.name = name;
     this.age = age;
 }    
}
//接口的意义在于
//接口就是一个规范,就是对类的限制,只要满足接口的要求就可以在特定的场景中使用
//接口和抽象类的区别在于,接口的实现仅仅只有抽象方法,而抽象类可以有抽象方法和普通方法

属性的封装

//如果没有对属性进行封装,属性可以任意被修改,所以需要对属性进行封装,可以在属性前添加属性修饰符
class Person{
   public   name:string = '孙悟空';
   pravite  age:number = 18
   getName(){
       return name
   }//用来获取
   setName(value:string){
     this.name = string  
   }//用来更改name
   get name(){
    return this._name
  }//可以写起来更加方便
   set name(value:string){
        this._name = value  
   }
}
let p = new Person()
p.getName() //获取类中的数据
p.setName("wwwwww") //将类中的name属性更改成wwww
//pubulic公共属性,不写默认是公共方式
//pravite私有属性,只能在类的内部进行修改,可以在类的内部定义方法在外边可以使用
//protected保护属性,只能在类里面或者当前类子类里面进行更改

新语法

class Dog extends Animal{   //实际上就是扩展继承过后animal所有的属性dog都包含
    constructor(pubulic name:string, pravite age:number,protected gender:string){
     super(name,age)   
     console.log(this)
     this.name = name;
     this.age = age;
     this.gender = gender   
 }

泛型(为了明确类型)

//类型不确定的类型
function fn<T,K>(a:T,b:K):T{
   return a 
}
//直接调用具有泛型的函数
fn(10);//可以自己判断
fn<number>("111111")//手动指令的将数据的类型设置为number
Interface inter{
    length:number
}
function fn<T extends inter>(a:T):number{
    return a.length
}
//在类中使用泛型
class Myclass<>{
    name:T,
    constructor(name:T){
       this.name = name 
    }
    
}
let ccc = new Myclass<string>("孙悟空")

接口和泛型,抽象类是锦上添花的作用。

上一篇:轻松将多个竖屏视频改为横屏,格式转为TS


下一篇:P1601 A+B Problem(高精)