函数的声明
函数的重载
类的声明使用和继承
静态属性和方法
访问控制福
面向对象中的所谓封装,本质上就是把一系列相关的数据(属性/变量/字段)和操作数据的方法(方法/函数)集中到一个数据结构中(类),达到隐藏数据和操作数据的方法,对外暴露有限的操作数据方法。
TypeScript 中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。TypeScript 支持 3 种不同的访问权限。\
- public(默认) : 公有的,可以在任何地方被访问。
- protected : 受保护,可以被其自身以及其子类和父类访问。
- private : 私有,只能被其定义所在的类访问。
/ 公有属性: 允许任何一个地方调用
// 私有属性: 仅允许当前类内部进行调用
// 保护属性: 仅允许当前类或直接间接继承了当前类的子类内部进行调用
class Proto{
public desc(){ // 公有方法
return `我住在树上`;
}
}
class Humen extends Proto{
public address:string = "北京市"; // 公有属性
public desc(){ // 公有方法
return `我住在${this.address}`;
}
private money:number = 10000; // 私有属性
private calc_money(){
return this.money*0.1; // 类的内部才可以调用私有属性,私有方法
}
// 如果允许私有属性提供给外界查看, 往往通过公有方法来进行暴露
public show_money(){
return this.calc_money();
}
protected phone:string = "13300000000"; // 保护属性
protected get_phone(){ // 保护方法
return `我的手机号码:${this.phone}`; // 类的内部或者子类才可以调用保护属性/方法
}
// 如果允许保护属性提供给外界查看,往往通过公有方法来进行暴露
public show_phone(key?){
if(key == "123456"){
return this.get_phone();
}
}
}
class People extends Humen{
public show_father_data(){
// return this.phone; // 调用了父类的保护属性
// return this.get_phone(); // 调用了父类的保护方法
return this.show_money(); // 子类无法调用父类的私有属性或方法
// return this.desc(); // 调用继承到的父类方法或者属性,如果当前类重载了则出现覆盖
// return super.desc();
}
public desc(){
return `您好, 我住在${this.address}`;
}
}
var xiaoming = new People();
// console.log(xiaoming.phone); // 类的外部无法调用私有或受保护的属性
// console.log(xiaoming.address);
// console.log(xiaoming.desc());
// console.log(xiaoming.show_money());
// console.log(xiaoming.show_phone());
// console.log(xiaoming.show_phone(123456));
console.log(xiaoming.show_father_data());
存取器
抽象类
抽象类(abstract class)做为其它派生类的基类使用。 它们一般不会直接被实例化。 不同于接口,抽象类可以包含成员的实现细节。 abstract
关键字是用于定义抽象类和在抽象类内部定义抽象方法。
代码:
// 抽象父类
abstract class Animal{
abstract makeSound(): void; // 抽象方法,没有函数体
desc(): void { // 抽象类中也可以定义子类的公共方法或公共属性
console.log('roaming the earch...');
}
}
// 抽象父类
abstract class Dog extends Animal{
abstract nickname:string;
abstract move(): string;
}
// 具象类/具体类
class ChineseGardenDog extends Dog{
public nickname:string;
constructor(nickname:string){
super(); // 继承了抽象类的子类,必须对父类进行初始化
this.nickname = nickname;
}
makeSound(){
return "汪汪汪~"
}
move(): string {
return "奔跑中....";
}
}
var dog = new ChineseGardenDog("来福");
console.log(dog.nickname);
console.log(dog.makeSound());
python中的抽象类
在python的基本语法中是没有抽象类和接口概念的。所以,要实现类似接口或者抽象类的场景,可以借助python内置的标准库,abc模块来实现。
import abc # 利用abc模块实现抽象类
class File(metaclass=abc.ABCMeta): # abc.ABCMeta是实现抽象类的一个基础类
@abc.abstractmethod # 定义抽象方法,无需实现功能
def read(self):
pass
class Txt(File): # 子类继承抽象类,但是必须定义read方法将抽象类中的read方法覆盖
def read(self):
print('文本数据的读取方法')
if __name__ == '__main__':
txt1 = Txt()
txt1.read()
# 抽象类是无法直接实例化的
tet2 = File()
tet2.read()