C# 继承(Inheritance)详解
继承是面向对象编程中的一个基本概念,它允许一个类从另一个类继承成员(如字段、方法、属性等)。在 C# 中,继承通过 : 语法来实现。继承的主要目的是提高代码的重用性,同时也可以实现多态。
一、继承的基本概念
- 基类(Parent Class):被继承的类。
- 子类(Derived Class):继承基类的类,可以使用基类的功能,且可以添加自己的功能。
继承的特点:
- 子类可以继承基类的成员:子类可以访问基类中的公共成员和保护成员。
- 子类可以重写基类的方法:子类可以提供自定义的实现(方法重写)。
- 子类可以添加自己的成员:除了继承父类的成员外,子类还可以添加自己的字段、属性和方法。
- 单继承: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 类自己的方法
三、构造函数和继承
- 基类构造函数:如果基类定义了构造函数,子类需要使用
base关键字来调用基类的构造函数。 - 子类构造函数:如果子类没有显式定义构造函数,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()); // 访问基类的私有成员
}
}
六、基类与子类的类型转换
- 向上转型(Upcasting):子类对象可以赋给父类引用变量。向上转型是自动的,因为子类是父类的类型。
Dog dog = new Dog();
Animal animal = dog; // 向上转型
- 向下转型(Downcasting):父类引用可以转换为子类类型,但必须显式转换,并且需要进行类型检查。
Animal animal = new Dog();
Dog dog = (Dog)animal; // 向下转型
// 推荐使用 `as` 或 `is` 进行类型检查
if (animal is Dog dogObj)
{
dogObj.Bark();
}
七、参考文献和文档
通过继承,C# 允许开发者实现更高效和灵活的代码重用,并能够更好地支持多态性,使得软件开发更加模块化和可扩展。
更多详细内容,请关注其他相关文章!