class修饰符的使用及区别
public、private、protected、static、abstract
public:可以继承、实例化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class Person { public name: string ; constructor(thename: string ) { this .name = thename; } } class Jack extends Person { age: number; constructor(name: string , age: number) { super(name) this .age = age; } say() { console.log(`my name is ${ this .name}, age ${ this .age}`); } } let p1 = new Person( 'tom' ); console.log(p1.name); // tom let j1 = new Jack( 'jacker' , 10); j1.say(); // my name is jacker age 10 |
private 私有属性只能在基类中访问,不能在实例、派生类中访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | class Person { private name: string ; constructor(thename: string ) { this .name = thename; } sayname() { console.log(`my name is ${ this .name}`); } } class Jack extends Person { age: number; constructor(name: string , age: number) { super(name) this .age = age; } say() { // 只能在Person中访问 // console.log(`my name is ${this.name}, age ${this.age}`); // error } } let p1 = new Person( 'tom' ); p1.sayname(); // tom // console.log(p1.name); // tom // error 只能在Person中访问 let j1 = new Jack( 'jacker' , 10); j1.sayname(); // jacker |
protected 受保护的,可以被继承,在派生类中可以访问,子类、父类都不能实例访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | class Person { protected name: string ; constructor(thename: string ) { this .name = thename; } sayname() { console.log(`my name is ${ this .name}`); } } class Jack extends Person { constructor(name: string ) { super(name) } say() { // 只能在Person中访问 console.log(`my name is ${ this .name}`); } } let p1 = new Person( 'tom' ); p1.sayname(); // tom console.log(p1.name); // tom // error 只能在Person、子类中访问 let j1 = new Jack( 'jacker' ); j1.say(); // jacker console.log(j1.name); // error 只能在Person、子类中访问 |
// static 只能通过基类、子类访问,实例不能访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | class Person { static myName: string ; constructor(name: string ) { Person.myName = name; } sayname() { return Person.myName; } } class Jack extends Person { constructor() { super( 'jacker' ); } } let p1 = new Person( 'tom' ); p1.myName; // error Person上不存在myName属性 console.log(p1.sayname()); // tom // 在类的外部访问 console.log(Person.myName); // tom let j1 = new Jack(); // 子类实例访问基类方法 console.log(j1.sayname()); // jacker j1.myName // error Jack 上不存在myName属性 // 子类访问静态属性 console.log(Jack.myName); // jacker |
// abstract 抽象类中的抽象方法不包含具体实现并且必须在派生类中实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | abstract class Person { sayname() { console.log( 'my name is sayname' ); } // 抽象方法不具体实现 abstract say(): void ; } class Jack extends Person { // 子类必须实现父类抽象方法 say() { console.log( 'my name is jacker' ); } } // let p1 = new Person(); // 抽象类不可以被实例化 let j1 = new Jack(); j1.sayname(); j1.say() |
class修饰符的使用及区别
public、private、protected、static、abstract
public:可以继承、实例化
private 私有属性只能在基类中访问,不能在实例、派生类中访问
protected 受保护的,可以被继承,在派生类中可以访问,子类、父类都不能实例访问
// static 只能通过基类、子类访问,实例不能访问
// abstract 抽象类中的抽象方法不包含具体实现并且必须在派生类中实现
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗