ts中类的继承

定义类

复制代码
class Person {
    name: string;   //属性
    constructor(_name: string) {
        this.name = _name;
    }   //构造函数
    sayHello(): string {
        return "Hi,everyone"
    }   //方法
}

let firstOne = new Person("Fred")   //实例化类
复制代码

继承:继承使用关键字extends,调用父类使用super,子类继承父类的属性和方法,并且子类可以改写父类的属性和方法

复制代码
class Animal {
    name: string;
    constructor(_name: string) {
        this.name = _name;
    }
    skinColour(color: string = "black"): void {
        console.log(`${this.name} skin colour is ${color}`)
    }
}

class Horse extends Animal {
    constructor(name: string) { super(name) }
    skinColour(color: string = "brown"): void {
        console.log(`I'am ${this.name}`);
        super.skinColour("brown");
    }
}

let horse = new Horse("horse");
horse.skinColour()
// I'am horse
// horse skin colour is brown
复制代码

public、private、protected、readonly

  • public(不声明默认都为public,也可以显示的设置为public)
    复制代码
    class Person {
        public name: string;   //属性
        public constructor(_name: string) {
            this.name = _name;
        }   //构造函数
        public sayHello(): string {
            return "Hi,everyone"
        }   //方法
    }
    
    let firstOne = new Person("Fred")   //实例化类
    复制代码
  • private(private的成员不能被外部访问;比较带有privateprotected成员的类型时,两个类型兼容的条件是private或protected的成员必须相同切来至同一个声明(同一个类))
    复制代码
    class Person {
        private name: string;   
        public constructor(_name: string) {
            this.name = _name;
        }   
    }
    
    class Employee {
        private name: string;   
        public constructor(_name: string) {
            this.name = _name;
        }   
    }
    
    let firstOne = new Person("Fred")
    console.log(firstOne.name)  //error: Property 'name' is private;
    let lastOne = new Employee("Fred")
    firstOne = lastOne  // error: Type 'Employee' is not assignable to type 'Person'.Types have separate declarations of a private property 'name'.
    复制代码
  • protected(protected和private相似,但protected成员可以在派生类中访问(能被继承,但不能在实例中访问,若构造函数是protected,则不能被实例化,只能被继承))
    复制代码
    class Person {
        protected name: string;   
        protected constructor(_name: string) {
            this.name = _name;
        }   
    }
    
    class Employee extends Person {
        private department: string;   
        public constructor(name: string,department:string) {
            super(name);
            this.department = department;
        }   
    }
    
    let Bob = new Person;   //error: Constructor of class 'Person' is protected
    let fred = new Employee("fred","test");
    console.log(fred.name)  //error: Property 'name' is protected
    复制代码
  • readonly(设置属性为只读,必须在声明时或构造函数里初始化)
    复制代码
    class Person {
        readonly name: string;   
        constructor(_name: string) {
            this.name = _name;
        }   
    }
    
    let fred = new Person("fred");
    fred.name = "Bob"   //error: Cannot assign to 'name' because it is a constant or a read-only property.
    复制代码

    参数属性(参数属性通过给构造函数参数添加一个访问限定符来声明(public,private,protected),把声明和赋值合并至一处)

    复制代码
    class Person {
        constructor(private name: string) { }
        sayHello(): void {
            console.log(`my name is ${this.name}`)
        }
    }
    
    let fred = new Person("fred");
    fred.sayHello() //my name is fred
    复制代码

    存取器(get、set   只带有 get不带有set的存取器自动被推断为readonly

    复制代码
    let passcode = "secret passcode";
    
    class Employee {
        private _fullName: string;
    
        get fullName(): string {
            return this._fullName;
        }
    
        set fullName(newName: string) {
            if (passcode && passcode == "secret passcode") {
                this._fullName = newName;
            }
            else {
                console.log("Error: Unauthorized update of employee!");
            }
        }
    }
    
    let employee = new Employee();
    employee.fullName = "Bob Smith";
    if (employee.fullName) {
        console.log(employee.fullName);
    }
    复制代码

    静态属性(static,不能被实例访问,在类里面访问时,需要加上类名)

    复制代码
    class Person {
        static height:number = 180;
        constructor(private name: string) { }
        sayHello(): void {
            console.log(`my name is ${this.name}, I height is ${Person.height}`)
        }
    }
    
    let fred = new Person("fred");
    fred.sayHello() //my name is fred, I height is 180
    复制代码

    抽象类(abstract,抽象类做为其它派生类的基类使用。 它们一般不会直接被实例化。抽象类中的抽象方法不包含具体实现并且必须在派生类中实现)

    复制代码
    abstract class Person {
        constructor(public name: string) { }
        abstract sayHello():void;
    }
    
    class Empoloy extends Person{
        constructor(){
            super("Fred")
        }
        sayHello(){
            console.log(`my name is ${this.name}`)
        }
    }
    
    let firstOne = new Empoloy();
    firstOne.sayHello();    //my name is Fred
    复制代码

     

posted @   ~逍遥★星辰~  阅读(12785)  评论(3编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示