举例说明继承封装多态
继承、封装和多态是面向对象程序设计的三大特征,也是面向对象语言的基本概念。继承是指一个类可以派生出子类,子类拥有父类的所有属性和方法,可以在其基础上进行扩展;封装是指将数据和操作封装在一个类中,对外部类隐藏内部实现细节,仅对外部提供公共接口;多态是指通过同一个方法名调用不同的方法实现不同的功能。本文将分别从继承、封装和多态三个方面详细说明其概念和实现方法,并举例说明其在实际编程中的应用。
继承的概念和实现方法
继承是指一个类可以派生出子类,子类可以继承父类的属性和方法,同时还可以在其基础上进行扩展和修改。在具体实现时,可以通过在类名后加上冒号和父类名的方式进行继承,如下所示:
```
class B extends A {
// 子类的具体实现
}
```
其中,B 是子类,A 是父类,通过 extends 关键词进行继承。子类可以新增属性和方法,同时也可以重写父类的方法。下面举一个例子,说明继承的实际应用:
```
class Animal {
constructor(name) {
this.name = name;
}
eat() {
console.log(`${this.name} is eating.`);
}
}
class Cat extends Animal {
meow() {
console.log(`${this.name} is meowing.`);
}
}
const tom = new Cat('Tom');
tom.eat(); // Tom is eating.
tom.meow(); // Tom is meowing.
```
在上面的代码中,Animal 是父类,Cat 是子类,Cat 继承了 Animal 的属性和方法,同时还添加了 meow 方法。这样,我们就可以通过 tom 实例对象进行 eat 和 meow 方法的调用。
封装的概念和实现方法
封装是指将数据和操作封装在一个类中,对外部类隐藏内部实现细节,仅对外部提供公共接口。具体实现时,需要使用访问修饰符控制访问权限,比如 public、private 和 protected 关键词。其中,public 表示公共属性和方法,可以被外部访问;private 表示私有属性和方法,只能在类的内部进行访问;protected 表示受保护的属性和方法,只能在类的内部或其子类中进行访问。下面通过一个例子,说明封装的实际应用:
```
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
getName() {
return this.name;
}
setName(name) {
this.name = name;
}
getAge() {
return this.age;
}
setAge(age) {
this.age = age;
}
}
const tom = new Person('Tom', 20);
console.log(tom.getName()); // Tom
console.log(tom.getAge()); // 20
tom.setName('Tommy');
tom.setAge(21);
console.log(tom.getName()); // Tommy
console.log(tom.getAge()); // 21
```
在 Person 类中,将 name 和 age 属性定义为私有属性,通过 getName、setName、getAge、setAge 四个方法对其进行访问和赋值。这样,外部代码无法直接访问和修改这些属性,必须通过公共接口进行操作,数据的安全性得到了提高。
多态的概念和实现方法
多态是指通过同一个方法名调用不同的方法实现不同的功能。具体实现时,可以使用继承和重载两种方式。继承实现的多态是指子类重写父类的方法,从而实现不同的功能;重载实现的多态是指同一个类的不同方法拥有相同的名称,但参数不同,从而实现不同的功能。下面通过一个例子,说明多态的实际应用:
```
class Animal {
speak() {
console.log('...');
}
}
class Dog extends Animal {
speak() {
console.log('woof!');
}
}
class Cat extends Animal {
speak() {
console.log('meow!');
}
}
function makeSound(animal) {
animal.speak(); // 多态调用
}
const tom = new Cat();
const spike = new Dog();
makeSound(tom); // meow!
makeSound(spike); // woof!
```
在上面的代码中,Animal 是父类,Dog 和 Cat 是子类。Animal 中的 speak 方法是一个空方法,子类分别重写了这个方法并实现了不同的功能。makeSound 函数接受一个参数 animal,调用该参数的 speak 方法,实现了多态。通过传入不同的子类实例对象,调用了不同的方法,实现了不同的功能。