C# 继承(Inheritance)详解
                           
天天向上
发布: 2025-04-13 13:41:30

原创
979 人浏览过

继承是面向对象编程中的一个基本概念,它允许一个类从另一个类继承成员(如字段、方法、属性等)。在 C# 中,继承通过 : 语法来实现。继承的主要目的是提高代码的重用性,同时也可以实现多态。


一、继承的基本概念

  • 基类(Parent Class):被继承的类。
  • 子类(Derived Class):继承基类的类,可以使用基类的功能,且可以添加自己的功能。

继承的特点:

  1. 子类可以继承基类的成员:子类可以访问基类中的公共成员和保护成员。
  2. 子类可以重写基类的方法:子类可以提供自定义的实现(方法重写)。
  3. 子类可以添加自己的成员:除了继承父类的成员外,子类还可以添加自己的字段、属性和方法。
  4. 单继承:C# 只支持单继承,即一个类只能继承一个类,但可以实现多个接口。

二、继承的基本语法

1. 基类(Parent Class)

class Animal
{
    public void Eat()
    {
        Console.WriteLine("Animal is eating.");
    }

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

2. 子类(Derived Class)

通过 : 关键字,子类可以继承基类的成员。

class Dog : Animal  // Dog 类继承自 Animal 类
{
    public void Bark()
    {
        Console.WriteLine("Dog is barking.");
    }
}

3. 创建子类实例并使用继承的功能

Dog dog = new Dog();
dog.Eat();    // 继承自 Animal 类
dog.Sleep();  // 继承自 Animal 类
dog.Bark();   // Dog 类自己的方法

三、构造函数和继承

  1. 基类构造函数:如果基类定义了构造函数,子类需要使用 base 关键字来调用基类的构造函数。
  2. 子类构造函数:如果子类没有显式定义构造函数,C# 会自动调用无参的构造函数。

示例:

class Animal
{
    public Animal(string name)
    {
        Console.WriteLine("Animal's name is " + name);
    }
}

class Dog : Animal
{
    public Dog(string name) : base(name)  // 调用基类的构造函数
    {
        Console.WriteLine("Dog is created.");
    }
}

创建对象:

Dog dog = new Dog("Buddy");

输出:

Animal's name is Buddy
Dog is created.

四、方法重写与虚拟方法

C# 支持方法重写(Overriding),子类可以重新定义从基类继承的方法。方法重写使用 virtual 关键字定义,子类使用 override 关键字重写。

1. 基类定义虚拟方法

class Animal
{
    public virtual void Speak()  // 使用 virtual 关键字定义虚拟方法
    {
        Console.WriteLine("Animal speaks");
    }
}

2. 子类重写方法

class Dog : Animal
{
    public override void Speak()  // 使用 override 关键字重写方法
    {
        Console.WriteLine("Dog barks");
    }
}

3. 使用重写的方法

Animal animal = new Dog();  // 基类引用指向子类对象
animal.Speak();  // 输出 Dog barks

五、访问修饰符和继承

C# 中的访问修饰符可以影响继承。默认情况下,private 成员不能被继承,protected 成员可以在子类中访问。

1. 公共成员(public

子类可以继承并访问基类的公共成员。

class Animal
{
    public string Name;
}

class Dog : Animal
{
    public void PrintName()
    {
        Console.WriteLine(Name);  // 继承并访问基类的公共成员
    }
}

2. 保护成员(protected

保护成员只能在类及其派生类中访问。

class Animal
{
    protected string Name;
}

class Dog : Animal
{
    public void SetName(string name)
    {
        Name = name;  // 可以访问基类的保护成员
    }
}

3. 私有成员(private

私有成员无法被子类直接访问,只能通过公共方法或属性访问。

class Animal
{
    private string name;

    public string GetName()  // 通过公共方法访问私有成员
    {
        return name;
    }
}

class Dog : Animal
{
    public void PrintName()
    {
        Console.WriteLine(GetName());  // 访问基类的私有成员
    }
}

六、基类与子类的类型转换

  1. 向上转型(Upcasting):子类对象可以赋给父类引用变量。向上转型是自动的,因为子类是父类的类型。
   Dog dog = new Dog();
   Animal animal = dog;  // 向上转型
  1. 向下转型(Downcasting):父类引用可以转换为子类类型,但必须显式转换,并且需要进行类型检查。
   Animal animal = new Dog();
   Dog dog = (Dog)animal;  // 向下转型

   // 推荐使用 `as` 或 `is` 进行类型检查
   if (animal is Dog dogObj)
   {
       dogObj.Bark();
   }

七、参考文献和文档


通过继承,C# 允许开发者实现更高效和灵活的代码重用,并能够更好地支持多态性,使得软件开发更加模块化和可扩展。

更多详细内容,请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *