深入理解面向对象三大特性

266 阅读5分钟

屏幕截图 2025-01-16 191553.png

前言

  • 学习之路需深耕细作,切勿轻视任一知识点,因其存在必蕴含深意

  • 面向对象的三大特性指的是封装继承多态。这些特性使得面向对象编程(OOP)成为一种强大且灵活的编程范式。面向对象编程的这三大特性相互协作,使得开发者能够创建更加模块化复用性强易于维护的代码。通过封装,可以隐藏对象的内部实现细节;通过继承,可以实现代码的重用和扩展;通过多态,可以实现更加灵活和动态的行为。

封装

  1. 封装的定义
  • 封装是一种信息隐蔽技术,是将对象的属性和方法结合在一起,并隐藏对象的内部细节,仅对外公开接口。
  • 通过封装,可以保护对象的数据不被外部直接访问和修改,从而确保数据的完整性和安全性。

直接上图

屏幕截图 2025-01-16 194918.png

将插线板比作对象,它由一块电板(属性)以及复杂的电路(方法)组成,我们不用去搞懂他的电路构造(内部细节),只需要电工(开发人员)将其封装好,我们就可以通过插孔(接口)直接使用了。

  1. 封装的使用
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}
  1. 优点
  • 数据隐藏:封装通过私有成员(如私有变量和方法)隐藏了对象的内部状态和行为,仅通过公共接口(如getter和setter方法)暴露必要的部分。这有助于保护数据不被外部直接访问和修改,从而减少了错误和依赖。
  • 模块化:封装使得类可以作为一个独立的模块来设计和实现,减少了类之间的耦合。这有助于代码的维护和扩展,因为你可以在不影响其他部分的情况下修改或替换一个类的实现。
  • 抽象层次:封装提供了不同层次的抽象,使得程序员可以关注于更高层次的功能,而不必关心底层的实现细节。这有助于提高代码的可读性和可维护性。

继承

  1. 继承的定义
  • 继承是指子类可以继承父类的属性和方法,从而实现代码的重用。
  • 通过继承,子类可以扩展父类的功能,同时保留父类的现有行为。
  • 继承有助于建立类之间的层次结构,使得代码更加模块化易于维护

直接上图

屏幕截图 2025-01-16 204650.png

图中的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();
  1. 继承的优点
  • 代码重用
    继承允许子类复用父类的代码。这意味着如果多个类有共享的功能或属性,你可以将这些共享的部分放在一个父类中,然后让子类继承这个父类。这样,你就不需要在每个子类中重复编写相同的代码了。

  • 扩展性
    通过继承,子类可以在父类的基础上添加新的功能或属性,从而扩展父类的能力。这种扩展性使得代码更加灵活,能够适应不断变化的需求。

  • 多态性
    继承是实现多态性的基础。多态性允许你使用父类类型的引用来指向子类对象,并根据实际对象的类型来调用相应的方法。这使得代码更加通用和灵活。

多态

  1. 多态的定义

多态(Polymorphism)是面向对象编程中的一个核心概念,它允许一个接口被多个不同的类实现。相同的操作或函数可以在作用于不同的对象时,产生不同的解释和不同的执行结果。

直接上图

屏幕截图 2025-01-19 211129.png

图中打印机中的打印方法彩色打印机黑白打印机实现,但具体的实现方式各有不同, 同一种方法被不同对象使用时会有不同的表现形式。

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.多态的优点

  1. 提高了代码的复用性和可扩展性:通过多态,可以使用父类类型的变量来引用子类对象,从而实现代码的复用。同时,当需要添加新的子类时,只需要继承父类或实现接口,并重写相应的方法即可,无需修改现有代码。
  2. 增强了代码的灵活性:多态允许在运行时动态地调用子类的方法,从而可以根据不同的对象类型执行不同的行为。
  3. 简化了代码结构:多态使得可以使用更少的代码来处理不同类型的对象,从而简化了代码结构。