Typescript 类
Typescript 中的类的行为与您在 C# 或 Java 中看到的类非常相似。语法与构造函数语法中最显着的变化略有不同。
类的简单示例如下所示。
class Shape {
name: string;
constructor(n:string) {
this.name=n;
}
getName() { return this.name;}
}
请注意构造函数如何使用关键字构造函数而不是类名。另请注意,当我们引用类属性时,我们需要在名称前面加上“this.”。这两种想法都与您之前看到的 C# 或 Java 类不同。
我们可以通过使用 new 关键字使用此类创建一个对象,如下所示。
let blob1 = new Shape("blob");
继承也与其他语言类似。例如,我们可以扩展上面的类,如以下示例所示。
class Square extends Shape {
side: number;
constructor(n:string, s:number) {
super(n);
this.side = s;
}
area() { return this.side * this.side;}
details() {
return "shape:" + super.getName() + ", Area:" + this.area();
}
}
此示例还演示如何使用 super() 函数调用基类的构造函数。它还演示如何使用 super 关键字访问基类的继承成员。Square 对象的创建示例如下。
let square1 = new Square("square", 2);
您可能已经注意到,我们没有使用以其他语言强制执行的公共、私有和受保护的关键字。在 Typescript 中,public 是所有类成员的默认访问修饰符,我们在上面的类声明中使用了默认值。私有关键字和受保护关键字的操作与其他语言完全相同。作为它们使用的示例,我们可以按如下方式注释上面的 Shape 类。
class Shape {
private name: string;
public constructor(n:string) { this.name=n; }
public getName() { return this.name;}
}
通过在 name 属性上使用 private 关键字,我们可以防止直接访问它(即使在超类中)。这限制了上面 Square 类的定义,因为我们只能使用公共 getName() 成员函数来访问该属性。
下面的活动将审查这些访问修饰符。
Typescript 还允许我们在只能在属性定义或类的构造函数中分配值的类中指定只读属性。我们还可以指定与类而不是对象关联的静态属性。这两种方法的行为与您之前看到的 C# 或 Java 等效项完全相同。这将在下面的活动中进行修订。
我们还可以指定抽象类,并以与 C# 或 Java 相同的方式使用它们。当没有要从中创建的对象并且抽象类仅对继承层次结构有用时,我们将一个类指定为抽象类。当抽象类未提供任何实现但派生类必须提供实现时,成员函数被指定为抽象函数。这与你之前在 C# 或 Java 中看到的没有什么不同,但在下面的活动中进行了修订。
活动
1. 将Rectangle类的类定义写下来(与上面的Square类相似),其由两个额外参数length和width定义。与Square类相比,这个类会有一个额外的属性和构造函数参数。
public class Rectangle extends Shape {
private double length; // 长度,默认私有访问修饰符,只能在类内部访问
private double width; // 宽度,默认私有访问修饰符,只能在类内部访问
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
@Override
public double area() {
return length * width;
}
}
2. 使用public、private和protected访问修饰符对其进行完整注释。
public class Rectangle extends Shape {
private double length; // 长度,默认私有访问修饰符,只能在类内部访问
private double width; // 宽度,默认私有访问修饰符,只能在类内部访问
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
@Override
public double area() {
return length * width;
}
}
3. 将Shape类重新定义为一个抽象类。添加一个抽象的Area()方法来强制派生类实现它。
public abstract class Shape {
public abstract double area(); // 抽象方法,需要在派生类中实现
}
Typescript 类的最后一个属性是,我们可以指定类中实现的接口,正如我们在上一节的阅读中看到的那样。同样,从之前的研究中,您应该对此很熟悉。
3. 实现上述的Shape和Square类。创建一些Square对象,并使用console.log()打印正方形的面积。
public class Rectangle extends Shape {
private double length;
private double width;
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
@Override
public double area() {
return length * width;
}
}
4. 实现一个新的Rectangle类,它派生自Shape类。这个类将具有两个新属性,长度(length)和宽度(width)。创建一些Rectangle对象,并使用console.log()函数打印它们的面积。
Rectangle rectangle1 = new Rectangle(4, 6);
Rectangle rectangle2 = new Rectangle(8, 12);
System.out.println("Area of Rectangle 1: " + rectangle1.area());
System.out.println("Area of Rectangle 2: " + rectangle2.area());