前言
-
学习之路需深耕细作,切勿轻视任一知识点,因其存在必蕴含深意
-
面向对象的三大特性指的是封装、继承和多态。这些特性使得面向对象编程(OOP)成为一种强大且灵活的编程范式。面向对象编程的这三大特性相互协作,使得开发者能够创建更加模块化、复用性强和易于维护的代码。通过封装,可以隐藏对象的内部实现细节;通过继承,可以实现代码的重用和扩展;通过多态,可以实现更加灵活和动态的行为。
封装
- 封装的定义
- 封装是一种信息隐蔽技术,是将对象的属性和方法结合在一起,并隐藏对象的内部细节,仅对外公开接口。
- 通过封装,可以保护对象的数据不被外部直接访问和修改,从而确保数据的完整性和安全性。
直接上图
将插线板比作对象,它由一块电板(属性)以及复杂的电路(方法)组成,我们不用去搞懂他的电路构造(内部细节),只需要电工(开发人员)将其封装好,我们就可以通过插孔(接口)直接使用了。
- 封装的使用
class Person {
String name = "二狗";
int age = 20;
@override
String toString() {
return '姓名: $name, age: $age}';
}
}
void main() {
Person person = Person();
print(person.age);
print(person.toString());
//输出:
//20
//姓名: 二狗, 年龄: 20}
- 优点
- 数据隐藏:封装通过私有成员(如私有变量和方法)隐藏了对象的内部状态和行为,仅通过公共接口(如getter和setter方法)暴露必要的部分。这有助于保护数据不被外部直接访问和修改,从而减少了错误和依赖。
- 模块化:封装使得类可以作为一个独立的模块来设计和实现,减少了类之间的耦合。这有助于代码的维护和扩展,因为你可以在不影响其他部分的情况下修改或替换一个类的实现。
- 抽象层次:封装提供了不同层次的抽象,使得程序员可以关注于更高层次的功能,而不必关心底层的实现细节。这有助于提高代码的可读性和可维护性。
继承
- 继承的定义
- 继承是指子类可以继承父类的属性和方法,从而实现代码的重用。
- 通过继承,子类可以扩展父类的功能,同时保留父类的现有行为。
- 继承有助于建立类之间的层次结构,使得代码更加模块化和易于维护。
直接上图
图中的Person类是Teacher类和Student类的父类(基类),反之Teacher类和Student类是Person类的子类(派生类)
2.继承的使用
在Dart中,继承同样是一种强大的面向对象编程特性,它允许一个类(子类)继承另一个类(父类)的属性和方法。子类可以重用父类的代码,并且可以添加新的属性、方法或重写父类中的方法。
class Animal {
String name;
int age;
Animal(this.name, this.age);
void speak() {
}
void info() {
print('Name: $name, 年龄: $age岁');
}
}
// 定义派生类(子类) Dog 继承自 Animal
class Dog extends Animal {
String breed;
Dog(super.name,super.age,this.breed);
@override
void speak() {
print('$name 在汪汪叫!');
}
}
class Cat extends Animal {
String color;
Cat(super.name,super.age,this.color);
@override
void speak() {
print('$name 在喵喵叫');
}
}
void main() {
Dog dog = Dog('小狗', 3, '边牧');
dog.speak();
dog.info();
Cat cat = Cat('小猫', 2, '黑色');
cat.speak();
cat.info();
- 继承的优点
-
代码重用:
继承允许子类复用父类的代码。这意味着如果多个类有共享的功能或属性,你可以将这些共享的部分放在一个父类中,然后让子类继承这个父类。这样,你就不需要在每个子类中重复编写相同的代码了。 -
扩展性:
通过继承,子类可以在父类的基础上添加新的功能或属性,从而扩展父类的能力。这种扩展性使得代码更加灵活,能够适应不断变化的需求。 -
多态性:
继承是实现多态性的基础。多态性允许你使用父类类型的引用来指向子类对象,并根据实际对象的类型来调用相应的方法。这使得代码更加通用和灵活。
多态
- 多态的定义
多态(Polymorphism)是面向对象编程中的一个核心概念,它允许一个接口被多个不同的类实现。相同的操作或函数可以在作用于不同的对象时,产生不同的解释和不同的执行结果。
直接上图
图中打印机中的打印方法被彩色打印机和黑白打印机实现,但具体的实现方式各有不同, 同一种方法被不同对象使用时会有不同的表现形式。
2.多态的使用
abstract class Flyable {
void fly();
}
class Bird implements Flyable {
@override void
fly() {
print("I'm flying!");
}
}
void main() {
Flyable flyable = Bird();
flyable.fly();
// 输出: I'm flying!
}
在这个例子中,Bird类实现了Flyable接口,并提供了fly方法的具体实现。这样,Bird类的对象就可以被赋值给Flyable类型的变量,并通过这个变量来调用fly方法。
3.多态的优点
- 提高了代码的复用性和可扩展性:通过多态,可以使用父类类型的变量来引用子类对象,从而实现代码的复用。同时,当需要添加新的子类时,只需要继承父类或实现接口,并重写相应的方法即可,无需修改现有代码。
- 增强了代码的灵活性:多态允许在运行时动态地调用子类的方法,从而可以根据不同的对象类型执行不同的行为。
- 简化了代码结构:多态使得可以使用更少的代码来处理不同类型的对象,从而简化了代码结构。