zoukankan      html  css  js  c++  java
  • TypeScript类与继承和修饰符public 、private 、protected 的详细讲解

    1.我理解的类

    类可以理解成为一个模板,通过这个模板可以实例化某一个具体对象
    比如说:我们定义一个动物类,
    通过这个动物模板可以实例化成为猫或者其他具体的动物
    

    2.类的基本使用

    我们需要创建一个动物类;
    这个动物有姓名、【默认值小可爱,字符串类型】
    年龄、【默认值 20,数字类型】
    性别、【字符串类型】
    体重、【数字类型】
    爱好【爱好可有可无,如果有必须是一个数组类型的】
    这个动物类还有一个say的实例方法
    下面我们就开始实现
    
    class Animails {
        name: string
        age: number
        gender: string
        weight: string
        likes?: Array<any>
        //爱好这个属性可有可无,如果有必须是数组类型
        // 定义构造函数:为了将来实例化对象的时候,
    
        // 构造器直接对属性进行初始化
        // 需要给名称默认值小可爱、年龄默认值age=20
        constructor(
            name: string = '小可爱',
            age: number = 20,
            gender: string,
            weight: string,
            likes?: Array<any>
        ) {
            // 初始化属性中的数据
            this.name = name
            this.age = age
            this.gender = gender
            this.weight=weight
        }
        // 定义实例方法
        say() {
            console.log(
                `大家好我是${this.name},
                今年${this.age}岁了,
                性别:${this.gender},
                体重:${this.weight},
            `);
        }
    }
    // 实例化对象
    let pig = new Animails('猪猪侠', 10, '男', '30kg');
    pig.say();//调用实例方法
    

    3.实例化类的注意点

    当类中的属性都有默认值时,
    实例化对象的时候,
    可以不用进行进行初始化。
    类中的属性如果没有默认值,不是可选属性。必须一一赋值(初始化)
    就是说:
    我们必须对构造器中的属性进行一一赋值
    除非构造器中有默认值
    
    class Animails {
        name: string
        age: number
        constructor(
            name: string = '小可爱',
            age: number = 20,
        ) {
            // 初始化属性中的数据
            this.name = name
            this.age = age
        }
        // 定义实例方法
        say() {
            console.log( `大家好我是${this.name}, 今年${this.age}岁了, `);
        }
    }
    // 实例化对象
    let pig = new Animails();
    pig.say();//调用实例方法
    

    4.类与类之间的继承

    A类继承了B类,那么A类叫做子类;B类叫做基类
    子类--->又叫派生类
    基类--->又叫父类或者超类
    
    下面这个例子我们将子类MySon将会去继承Father父类。
    子类有属于自己的方法sonsay;
    子类可以去调用父类的方法super.say('子类');
    同时我们在子类中将会去重写父类的方法
    
    // 我们定义了一个超类【父类】
    class Father {
        // 定义属性
        name: string
        age: number
        // 定义构造函数
        constructor(name: string, age: number) {
            // 初始化属性中的数据
            this.name = name
            this.age = age
        }
        // 定义实例方法
        say(str:string) {
            console.log( `大家好我是${this.name}, 今年${this.age}岁了,${str}呼喊的我 `);
        }
    }
    
    // 子类去继承了父类
    class MySon extends Father {
        // constructor中的参数必须要满足父类。
        // 除非父类有默认参数或者父类中的属性不是必须属性。
        constructor(name: string, age: number) {
            // super调用父类中的构造函数
            super(name,age)
        }
        // 子类中自己的实例方法
        sonsay() {
            console.log('我是子类哈哈');
            //调用父类中的实例方法
            super.say('子类');
        }
    
        // 重写父类的方法
        say(name:string) {
            console.log(`我重写了父类的方法我是${name}`)
        }
    }
    // 进行实例化
    let xiaoming = new MySon('小明', 19);
    // 进行方法调用 
    xiaoming.sonsay();
    xiaoming.say('小明');
    

    5.修饰符的理解

    修饰符:主要用于描述类中的成员(属性、方法、构造函数,)的可访问行
    当一个类的成员变量没有修饰的时候,
    默认的就是 public 进行修饰。
    外界是可以进行访问的。任何位置都可以访问类中的成员
    
    private 属性【只能够】在父类的内部直接进行访问;
    class Person{
        age:10
        // private 属性只能够 在类的内部 进行访问;
        private name = "张三" 
        say() {
            console.log("我的名字是"+this.name)
        }
    }
    

    6.private的理解

    如果父类定义的私有属性或者方法的时候,
    那么继承的子类是不可以访问父类中的私有属性和私有方法
    在实例化的时候也是不可以访问私有属性和私有方法
    
    子类继承父类后 
    访问父类属性通过this.属性名
    调用父类的方法 this.方法名
    
    下面我们看一下:
    子类是否可以访问父类中的私有属性?
    实例化后是否可以访问父类中的私有属性?
    
    class Person {
        age: 10;
        // private 属性只能够在类的内部进行访问;
        private name = "张三";
        say() {
          //内部访问是ok的哈
          console.log("我的名字是" + this.name);
        }
    }
    class Children extends Person {
        sayage() {
            console.log('访问父类属性年龄',this.age)
        }
        // 下面这种访问是非法的会报错 
        sayname() {
            console.log('访问父类属性姓名',this.name)
        }
    }
    var xm = new Children();
    xm.say();//我的名字是张三
    // 报错,因为name是父类私有的,
    // 实例化的时候不能够进行访问 
    console.log( xm.name )
    

    7.protected 的理解

    protected修饰的属性和方法是受保护的,
    只能够在父类和其子类中访问。
    实例化后是不能够访问protected所修饰的属性和方法
    
    class Person {
        protected age:string
        constructor(age:string) {
          this.age=age
        }
        say() {
            console.log("我的年龄是" + this.age);
        }
    }
    
    // 继承父类
    class Children extends Person {
        callPar() {
          super.say(); //super 可以调用父类中的属性方法
        }
        hello() {
          console.log("我今年" + this.age);
        }
    }
    
    var xm = new Children('10');
    xm.hello(); //我今年10
    <!-- 提示 属性“age”受保护,只能在类“Person”及其子类中访问 -->
    console.log(xm.age)
    
    作者:明月人倚楼
    出处:https://www.cnblogs.com/IwishIcould/

    想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,或者关注博主,在此感谢!

    万水千山总是情,打赏5毛买辣条行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主(っ•̀ω•́)っ✎⁾⁾!

    想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!

    支付宝
    微信
    本文版权归作者所有,欢迎转载,未经作者同意须保留此段声明,在文章页面明显位置给出原文连接
    如果文中有什么错误,欢迎指出。以免更多的人被误导。
  • 相关阅读:
    VSCode中按ESLint规则格式化Javascript代码
    VSCode设置资源管理器字体大小
    Windows下利用安装压缩包安装MySQL
    Windows部署Apache 2.4.46及PHP 8.0.3
    npm设置国内镜像
    IDEA运行Tomcat输出信息乱码
    深入理解jvm虚拟机读书笔记-Java内存区域与内存溢出异常
    Navicat Premium
    mysql安装
    ElasticSearch 基础
  • 原文地址:https://www.cnblogs.com/IwishIcould/p/14965023.html
Copyright © 2011-2022 走看看