keywords: 继承, C# 继承, 基类和派生类, 方法重写, base 关键字


继承是面向对象编程(OOP)的一个核心概念,它允许我们创建一个基类,并让其他类从这个基类继承,从而共享其方法和属性。这不仅提高了代码的重用性,还促进了代码的组织和维护。

8.1 什么是继承

继承是一种机制,它允许一个类(派生类)从另一个类(基类)继承字段和方法。通过这种方式,派生类可以重用基类的代码,并且可以根据需要添加新的功能或重写现有功能。

8.2 基类和派生类

基类是其他类可以继承的类,它包含了通用的属性和方法。派生类是继承自基类的类,它继承了基类的所有属性和方法,并且可以增加自己的属性和方法。

  1. classDiagram
  2. Animal <|-- Cat
  3. Animal <|-- Dog
  4. class Animal {
  5. +string Name
  6. +Eat()
  7. +Sleep()
  8. }
  9. class Cat {
  10. +Meow()
  11. }
  12. class Dog {
  13. +Bark()
  14. }

在上面的类图中,Animal是一个基类,CatDog分别是从Animal继承的派生类。Cat类有一个独特的方法Meow(),而Dog类有一个独特的方法Bark()

示例代码

  1. public class Animal
  2. {
  3. public string Name { get; set; }
  4. public void Eat()
  5. {
  6. Console.WriteLine($"{Name} is eating.");
  7. }
  8. public void Sleep()
  9. {
  10. Console.WriteLine($"{Name} is sleeping.");
  11. }
  12. }
  13. public class Cat : Animal
  14. {
  15. public void Meow()
  16. {
  17. Console.WriteLine("Cat says: Meow!");
  18. }
  19. }
  20. public class Dog : Animal
  21. {
  22. public void Bark()
  23. {
  24. Console.WriteLine("Dog says: Bark!");
  25. }
  26. }

在这个代码示例中,CatDog类都继承了Animal类的Name属性、Eat方法和Sleep方法。

8.3 继承的实现

要实现继承,只需使用冒号(:)符号在派生类声明中指定基类。

示例代码

  1. public class Animal
  2. {
  3. public string Name { get; set; }
  4. public void Eat()
  5. {
  6. Console.WriteLine($"{Name} is eating.");
  7. }
  8. public void Sleep()
  9. {
  10. Console.WriteLine($"{Name} is sleeping.");
  11. }
  12. }
  13. public class Cat : Animal
  14. {
  15. public void Meow()
  16. {
  17. Console.WriteLine("Cat says: Meow!");
  18. }
  19. }

在这个示例中,Cat类使用冒号(:)继承了Animal类。

8.4 base 关键字

在派生类中,有时需要调用基类的构造函数或方法,这可以通过base关键字来实现。

示例代码

  1. public class Animal
  2. {
  3. public string Name { get; set; }
  4. public Animal(string name)
  5. {
  6. Name = name;
  7. }
  8. public void Eat()
  9. {
  10. Console.WriteLine($"{Name} is eating.");
  11. }
  12. public void Sleep()
  13. {
  14. Console.WriteLine($"{Name} is sleeping.");
  15. }
  16. }
  17. public class Cat : Animal
  18. {
  19. public Cat(string name) : base(name)
  20. {
  21. }
  22. public void Meow()
  23. {
  24. Console.WriteLine("Cat says: Meow!");
  25. }
  26. }

在这个示例中,Cat类的构造函数使用base关键字调用了基类Animal的构造函数。

8.5 方法的重写

方法重写允许派生类重新定义基类中的方法,从而提供新的实现。这需要在基类的方法前添加virtual关键字,并在派生类的方法前添加override关键字。

示例代码

  1. public class Animal
  2. {
  3. public string Name { get; set; }
  4. public virtual void Eat()
  5. {
  6. Console.WriteLine($"{Name} is eating.");
  7. }
  8. public void Sleep()
  9. {
  10. Console.WriteLine($"{Name} is sleeping.");
  11. }
  12. }
  13. public class Cat : Animal
  14. {
  15. public override void Eat()
  16. {
  17. Console.WriteLine($"{Name} is eating cat food.");
  18. }
  19. public void Meow()
  20. {
  21. Console.WriteLine("Cat says: Meow!");
  22. }
  23. }

在这个示例中,Cat类重写了Animal类的Eat方法,以提供不同的实现。

通过继承,代码得以重用和组织,更容易管理。理解和使用继承是掌握面向对象编程的重要一步。在下一章,我们将探讨多态,这是 OOP 的另一个关键概念。