TypeScript 中的类与对象:修饰符(public, private, protected)

在 TypeScript 中,类是面向对象编程的核心概念之一。类允许我们创建对象,并定义对象的属性和方法。为了控制类的成员(属性和方法)的可访问性,TypeScript 提供了三种访问修饰符:publicprivateprotected。在本教程中,我们将详细探讨这三种修饰符的用法、优缺点以及注意事项。

1. public 修饰符

定义与用法

public 是 TypeScript 中的默认修饰符。使用 public 修饰符声明的属性和方法可以在类的内部和外部访问。

示例代码

class Person {
    public name: string;
    public age: number;

    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }

    public greet(): void {
        console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
    }
}

const person = new Person("Alice", 30);
person.greet(); // 输出: Hello, my name is Alice and I am 30 years old.
console.log(person.name); // 输出: Alice

优点

  • 易于使用public 修饰符是默认的,使用起来非常简单。
  • 灵活性:可以在类的外部自由访问和修改属性。

缺点

  • 封装性差:由于 public 属性和方法可以被外部访问,可能导致不必要的依赖和错误的使用。

注意事项

  • 在设计类时,尽量避免将所有属性和方法都设为 public,以保持良好的封装性。

2. private 修饰符

定义与用法

private 修饰符用于声明只能在类的内部访问的属性和方法。外部无法直接访问这些成员。

示例代码

class BankAccount {
    private balance: number;

    constructor(initialBalance: number) {
        this.balance = initialBalance;
    }

    public deposit(amount: number): void {
        if (amount > 0) {
            this.balance += amount;
            console.log(`Deposited: ${amount}. New balance: ${this.balance}`);
        } else {
            console.log("Deposit amount must be positive.");
        }
    }

    public getBalance(): number {
        return this.balance;
    }
}

const account = new BankAccount(100);
account.deposit(50); // 输出: Deposited: 50. New balance: 150
console.log(account.getBalance()); // 输出: 150
// console.log(account.balance); // 错误: Property 'balance' is private and only accessible within class 'BankAccount'.

优点

  • 封装性强private 成员只能在类内部访问,保护了类的内部状态,避免外部代码对其进行不当操作。
  • 易于维护:可以在不影响外部代码的情况下修改类的内部实现。

缺点

  • 访问限制:外部无法直接访问 private 成员,可能导致某些操作变得复杂。

注意事项

  • 在需要保护类的内部状态时,使用 private 修饰符是一个好习惯。
  • 通过公共方法(如 getter 和 setter)来访问和修改 private 属性,可以提供更好的控制。

3. protected 修饰符

定义与用法

protected 修饰符与 private 类似,但它允许在子类中访问。也就是说,protected 成员可以在类内部和子类中访问,但不能在类的外部访问。

示例代码

class Animal {
    protected species: string;

    constructor(species: string) {
        this.species = species;
    }
}

class Dog extends Animal {
    public bark(): void {
        console.log(`Woof! I am a ${this.species}.`);
    }
}

const dog = new Dog("Dog");
dog.bark(); // 输出: Woof! I am a Dog.
// console.log(dog.species); // 错误: Property 'species' is protected and only accessible within class 'Animal' and its subclasses.

优点

  • 继承支持protected 成员可以在子类中访问,允许子类扩展父类的功能。
  • 封装性:与 private 类似,protected 成员也保护了类的内部状态。

缺点

  • 访问限制:外部无法访问 protected 成员,可能导致某些操作变得复杂。

注意事项

  • 使用 protected 修饰符时,确保子类需要访问父类的成员。
  • 适当使用 protected 可以提高代码的可重用性和可维护性。

总结

在 TypeScript 中,publicprivateprotected 修饰符为类的成员提供了不同级别的访问控制。选择合适的修饰符可以帮助我们实现良好的封装性和代码维护性。

  • public:适用于需要被外部访问的成员,但要注意封装性。
  • private:适用于需要保护的内部状态,提供良好的封装性。
  • protected:适用于需要在子类中访问的成员,支持继承。

在设计类时,合理使用这些修饰符可以提高代码的可读性、可维护性和安全性。希望本教程能帮助你更好地理解 TypeScript 中的类与对象的修饰符。