面向对象编程 (OOP) 基础

1. 什么是面向对象编程 (OOP)?

面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它将程序中的数据和操作数据的方法封装在一起,形成对象。OOP的核心思想是通过类和对象来模拟现实世界中的实体和它们之间的关系。

1.1 OOP 的核心概念

  • 类 (Class): 类是对象的蓝图或模板,定义了对象的属性和行为。
  • 对象 (Object): 对象是类的实例,具有类定义的属性和行为。
  • 封装 (Encapsulation): 封装是将数据和操作数据的方法绑定在一起,并通过访问修饰符(如 public, private)控制对数据的访问。
  • 继承 (Inheritance): 继承允许一个类继承另一个类的属性和方法,从而实现代码的重用。
  • 多态 (Polymorphism): 多态允许不同的类以不同的方式实现相同的方法,从而提高代码的灵活性和可扩展性。

2. 类和对象

2.1 定义类

在C#中,类是通过 class 关键字定义的。类可以包含字段(fields)、属性(properties)、方法(methods)等成员。

public class Person
{
    // 字段
    private string name;
    private int age;

    // 属性
    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    public int Age
    {
        get { return age; }
        set { age = value; }
    }

    // 方法
    public void SayHello()
    {
        Console.WriteLine($"Hello, my name is {name} and I am {age} years old.");
    }
}

2.2 创建对象

通过 new 关键字可以创建类的实例(对象)。

Person person = new Person();
person.Name = "Alice";
person.Age = 30;
person.SayHello();

2.3 构造函数

构造函数是类的一个特殊方法,用于初始化对象。构造函数与类同名,没有返回类型。

public class Person
{
    private string name;
    private int age;

    // 构造函数
    public Person(string name, int age)
    {
        this.name = name;
        this.age = age;
    }

    public void SayHello()
    {
        Console.WriteLine($"Hello, my name is {name} and I am {age} years old.");
    }
}

// 使用构造函数创建对象
Person person = new Person("Alice", 30);
person.SayHello();

3. 继承和多态

3.1 继承

继承允许一个类(子类)继承另一个类(父类)的属性和方法。子类可以重写父类的方法,也可以添加新的属性和方法。

public class Employee : Person
{
    private string employeeId;

    public Employee(string name, int age, string employeeId) : base(name, age)
    {
        this.employeeId = employeeId;
    }

    public void Work()
    {
        Console.WriteLine($"Employee {Name} with ID {employeeId} is working.");
    }
}

// 创建子类对象
Employee employee = new Employee("Bob", 25, "E12345");
employee.SayHello(); // 调用父类方法
employee.Work();     // 调用子类方法

3.2 多态

多态允许不同的类以不同的方式实现相同的方法。通过方法重写(override)和接口实现,可以实现多态。

public class Manager : Employee
{
    public Manager(string name, int age, string employeeId) : base(name, age, employeeId)
    {
    }

    public override void Work()
    {
        Console.WriteLine($"Manager {Name} with ID {employeeId} is managing the team.");
    }
}

// 多态示例
Employee manager = new Manager("Charlie", 40, "M67890");
manager.Work(); // 调用子类重写的方法

4. 接口和抽象类

4.1 接口

接口定义了一组方法的签名,但不包含实现。类可以通过实现接口来提供这些方法的具体实现。

public interface IWorkable
{
    void Work();
}

public class Programmer : IWorkable
{
    public void Work()
    {
        Console.WriteLine("Programmer is coding.");
    }
}

// 使用接口
IWorkable programmer = new Programmer();
programmer.Work();

4.2 抽象类

抽象类是不能实例化的类,它可以包含抽象方法(没有实现的方法)和具体方法(有实现的方法)。子类必须实现抽象类中的抽象方法。

public abstract class Animal
{
    public abstract void MakeSound();

    public void Sleep()
    {
        Console.WriteLine("Animal is sleeping.");
    }
}

public class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Dog is barking.");
    }
}

// 使用抽象类
Animal dog = new Dog();
dog.MakeSound();
dog.Sleep();

5. 实践练习

5.1 练习1:创建一个简单的银行账户系统

  1. 创建一个 BankAccount 类,包含 AccountNumber、Balance 和 Owner 属性。
  2. 添加 Deposit 和 Withdraw 方法。
  3. 创建一个 SavingsAccount 类,继承 BankAccount,并添加 InterestRate 属性。
  4. 在 SavingsAccount 中重写 Deposit 方法,使其在存款时自动计算利息。

5.2 练习2:实现一个简单的图形库

  1. 创建一个 Shape 抽象类,包含 Draw 抽象方法。
  2. 创建 Circle 和 Rectangle 类,继承 Shape,并实现 Draw 方法。
  3. 创建一个 ShapeDrawer 类,包含一个 DrawShape 方法,接受 Shape 对象并调用其 Draw 方法。

6. 总结

面向对象编程是现代软件开发中非常重要的编程范式。通过类和对象,我们可以更好地组织和管理代码,实现代码的重用和扩展。掌握OOP的核心概念,如封装、继承和多态,将帮助你编写更清晰、更易于维护的代码。

在接下来的课程中,我们将深入探讨更多高级的OOP概念,如接口、抽象类、泛型等,以及如何在实际项目中应用这些概念。