• 【TypeScript】-- TS之面向对象


    面向对象

    1.接口

    接口可以理解为一个特殊的类 / 特殊的对象,是抽象到极致的抽象类,接口中只能存在抽象方法和属性,抽象方法就是没有方法体的方法。

    接口通过interface关键字来声明;

    使用类去实现接口时, 接口就是标准,类会按照接口这个标准去实现

    使用类去实现接口时必须具备接口中具有的的属性和方法

    类接口 

    类使用接口用implements 关键字;

    类中可以拥有属于自己的属性和方法

    1. interface StudentInterFace{
    2. name;
    3. say(msg:string):void; // 未实现的方法
    4. // 抽象方法:没有方法体的方法
    5. }
    6. // 类使用implements关键字实现接口
    7. class Student implements StudentInterFace{
    8. // 必须包含接口里面的属性和方法
    9. name;
    10. say(msg:string):void{
    11. console.log(this.name + msg);
    12. }
    13. // 可以拥有属于自己的属性和方法
    14. constructor(name){
    15. this.name = name;
    16. }
    17. foo(){
    18. }
    19. }
    20. let student:StudentInterFace = new Student('zhaaoziyn');
    21. student.say('fff')

    对象接口 

    1. // 对象接口 创建出来的对象可以使用接口去实现
    2. enum Gender{
    3. mal='南',
    4. feml='女'
    5. }
    6. class Person{
    7. name:string;
    8. age:number;
    9. gender:Gender;
    10. }
    11. interface PropInterFace{
    12. data:Array<Person>;
    13. visible:boolean;
    14. }
    15. let prop:PropInterFace = {
    16. data:[
    17. {name:"xigua",age:12,gender:Gender.feml},
    18. {name:"may",age:27,gender:Gender.mal}
    19. ],
    20. visible:true
    21. }
    22. console.log(prop);


     多态(一个对象多种形态)

    若父类类型得引用指向子类的实例对象,则通过该引用可以访问到父类的属性与方法,但是无法访问子类的属性与方法;

    如果子类对父类得特性进行重写,通过该引用调用的重写特性依旧为子类特性。

    重写

    重写 如果子类中方法签名与父类一致 则会对父类方法进行重写

    1. // 类
    2. // es6 类是构造函数的另一种写法
    3. // 类是创建对象的模板 一个类可以创建多个对象
    4. class Person{
    5. name:string;
    6. age:number;
    7. // weight?:number;
    8. // say():void{
    9. // console.log('不许说话');
    10. // }
    11. }
    12. // 多态的前提是子类实现了对父类的继承
    13. class Student extends Person{
    14. stuNo:string;
    15. say():void{
    16. console.log('会说话就多说点');
    17. }
    18. }
    19. // new创建一个Student的实例对象s1
    20. // let s1:Person = new Student();
    21. let s1:Student = new Student(); // 多态
    22. s1.name = 'haha';
    23. s1.age = 14;
    24. s1.stuNo = '111'
    25. // 子类继承了父类
    26. // 子类对父类的方法进行了重写 会调用子类的方法
    27. s1.say(); //会说话就多说点
    28. console.log(s1); // Student { name: 'haha', age: 14 }
    29. // 字面量模式创建对象 如果加了Student的类型限制
    30. // 那么Student里面的属性与方法必须拥有
    31. let s2:Student={
    32. stuNo:'100000',
    33. name:'zzy',
    34. age:17,
    35. say() {
    36. console.log('听说你也想说话?');
    37. },
    38. }
    39. /**
    40. * 多态:一种对象多种形态
    41. * 子类继承了父类,若父类类型的引用指向了子类对象s1,
    42. * 则实例无法调用子类对象特性(属性、方法),但可以调用父类对象特性
    43. *
    44. * 重写:
    45. * 如果子类方法签名与父类一致,子类对父类的方法会进行重写
    46. * 并且会会调用子类里面的方法
    47. */

    抽象类

    什么是抽象类? ​ 一般情况下,抽象类无法创建对象,抽象类中可以存在抽象方法,没有方法体得方法就是 ​ 抽象方法只有抽象签名,抽象类中可以存在抽象方法和非抽象方法,一个类中具有抽象方法, ​ 那个该类一定是抽象类 ​ 存在得意义? ​ 为了让其它类继承抽象类,并强制要求子类实现抽象方法;

    子类继承抽象类:

    1. 子类必须实现抽象类中得方法
    2. 子类成为抽象类
    1. // 抽象类 里面存在抽象方法
    2. // 抽象方法 没有方法体的方法
    3. // 抽象类存在的意义:让其他类去继承抽象类
    4. // 无法创建抽象类本身的实例对象
    5. abstract class Teacher {
    6. abstract study():void;
    7. // 没有abstract修饰的,有方法体的方法不就是非抽象方法
    8. // 有抽象方法的类一定是抽象类
    9. log():void{
    10. console.log('not a abstract');
    11. }
    12. }
    13. // 子类继承抽象类
    14. // 1.子类必须包含抽象类里的抽象方法
    15. class Student1 extends Teacher{
    16. study(): void {
    17. console.log('好好学习');
    18. }
    19. cook():void{
    20. console.log('天天吃泡面');
    21. }
    22. }
    23. let s3:Teacher = new Student1();
    24. s3.study(); // 好好学习
    25. // 2. 自身也成为抽象类
    26. // abstract class Student2 extends Teacher{
    27. // }

    访问修饰符

    用于修饰类中的成员属性及成员方法(实例属性、实例方法)

    访问权限:

    public 公开 当前类、子类、其他类

    protected 受保护 当前类、子类

    private 私有 当前类

    1. class Person2{
    2. public name:string;
    3. protected age:number;
    4. private weight:number;
    5. readonly gender:string;
    6. constructor(name,age,weight,gender){
    7. this.name=name;
    8. this.age=age;
    9. this.weight=weight;
    10. this.gender=gender;
    11. }
    12. protected foo(){
    13. console.log(this.name);
    14. console.log(this.age);
    15. console.log(this.weight);
    16. }
    17. }
    18. class Student2 extends Person2{
    19. constructor(name,age,weight,gender){
    20. super(name,age,weight,gender);
    21. }
    22. bar(){
    23. super.foo()
    24. // super 父类的引用
    25. console.log(this.name);
    26. // console.log(super.age);
    27. }
    28. };
    29. let s4:Student2=new Student2('terry',12,40,'male');
    30. console.log(s4.name);
    31. // s4.gender='female'; 会报错,因为该属性是只读的
    32. s4.bar();

    readonly修饰符

    你可以使用 readonly关键字将属性设置为只读的。 只读属性必须在声明时或构造函数里被初始化。

    1. class Octopus {
    2. readonly name: string;
    3. readonly numberOfLegs: number = 8;
    4. constructor (theName: string) {
    5. this.name = theName;
    6. }
    7. }
    8. let dad = new Octopus("Man with the 8 strong legs");
    9. dad.name = "Man with the 3-piece suit"; // 错误! name 是只读的.

    可选属性

    有时我们希望不要与接口中的属性与方法完全一致,那么可以用 ? 表示一个可选属性:

    1. interface Person {
    2. name: string;
    3. age?: number;
    4. }
    5. let tom: Person = {
    6. name: 'Tom'
    7. };
    8. interface Person {
    9. name: string;
    10. age?: number;
    11. }
    12. let tom: Person = {
    13. name: 'Tom',
    14. age: 25
    15. };

     

  • 相关阅读:
    毕业三年的25岁码农总结
    minitest使用笔记1
    归并排序的简单理解
    计算机的种类
    简单了解 TiDB 架构
    OLED透明拼接屏在乌海湖旅游区的应用探究
    20世纪最佳12部学术专著
    【MySQL】为什么使用B+树做索引
    掘光者网课题库接口
    VeRA: Vector-based Random Matrix Adaptation
  • 原文地址:https://blog.csdn.net/qq_48802092/article/details/126984663