C# 一分钟浅谈:继承与多态性的实践

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
性能测试 PTS,5000VUM额度
简介: 【9月更文挑战第2天】本文从基础入手,详细介绍了面向对象编程中继承与多态性的核心概念。通过 `Animal`、`Dog` 和 `Cat` 类的示例代码,展示了如何利用继承重用代码及多态性实现不同对象对同一方法的多样化响应,帮助读者更好地理解和应用这两个重要概念,提升面向对象编程能力。

在面向对象编程中,继承和多态性是非常重要的概念。本文将从基础入手,逐步深入地介绍这两个概念,并通过具体的代码示例来帮助大家更好地理解和应用。
image.png

1. 继承的概念

什么是继承?

继承是一种使一个类(子类)继承另一个类(父类)的特性和行为的机制。子类可以重用父类中的方法和属性,并且还可以添加新的方法和属性或者覆盖父类的方法。

示例代码

假设我们有一个 Animal 类,表示所有动物的基本特性。

public class Animal
{
   
   
    public string Name {
   
    get; set; }
    public int Age {
   
    get; set; }

    public virtual void MakeSound()
    {
   
   
        Console.WriteLine("Some sound");
    }
}

现在我们可以创建一个新的 Dog 类,继承自 Animal 类。

public class Dog : Animal
{
   
   
    public void Bark()
    {
   
   
        Console.WriteLine("Woof woof!");
    }

    public override void MakeSound()
    {
   
   
        Console.WriteLine("Bark bark!");
    }
}

在这个例子中,Dog 类继承了 Animal 类的所有属性和方法,并且新增了一个 Bark 方法,同时覆盖了 MakeSound 方法。

创建对象

Dog dog = new Dog();
dog.Name = "Buddy";
dog.Age = 5;
dog.MakeSound();  // 输出: Bark bark!
dog.Bark();      // 输出: Woof woof!

2. 多态性的概念

什么是多态性?

多态性是指允许不同类的对象对同一消息作出响应的能力。简单来说,就是同一个方法可以根据不同的对象表现出不同的行为。

示例代码

我们可以创建一个新的 Cat 类,也继承自 Animal 类。

public class Cat : Animal
{
   
   
    public void Meow()
    {
   
   
        Console.WriteLine("Meow meow!");
    }

    public override void MakeSound()
    {
   
   
        Console.WriteLine("Meow meow!");
    }
}

现在我们可以创建一个 Animal 类型的数组,并存储不同类型的动物对象。

Animal[] animals = new Animal[]
{
   
   
    new Dog(),
    new Cat()
};

foreach (var animal in animals)
{
   
   
    animal.MakeSound();  // 输出: Bark bark! 和 Meow meow!
}

在这个例子中,虽然 animals 数组的元素都是 Animal 类型,但实际上它们可以存储任何继承自 Animal 的子类对象。当调用 MakeSound 方法时,实际执行的是子类的方法。

3. 常见问题与易错点

常见问题

  • 过度继承:过度使用继承可能导致类层次结构过于复杂,难以维护。
  • 方法覆盖不当:覆盖方法时,如果没有正确处理基类的方法,可能导致程序行为不符合预期。
  • 类型转换错误:在运行时进行类型转换时,如果对象的实际类型与期望类型不一致,会导致运行时错误。

如何避免

  • 合理设计类层次结构:尽量减少不必要的继承层次,保持类结构清晰。
  • 正确使用 overridevirtual 关键字:确保覆盖方法时正确使用 overridevirtual 关键字。
  • 使用 is 操作符进行类型检查:在进行类型转换前,先使用 is 操作符检查对象的实际类型。

示例代码

Animal animal = new Dog();
if (animal is Dog)
{
   
   
    ((Dog)animal).Bark();  // 输出: Woof woof!
}
else if (animal is Cat)
{
   
   
    ((Cat)animal).Meow();  // 输出: Meow meow!
}

在这个例子中,我们首先检查 animal 是否是 Dog 类型,如果是,则调用 Bark 方法;如果不是,则检查是否是 Cat 类型,如果是,则调用 Meow 方法。

4. 总结

通过本文的学习,相信你对 C# 中的继承和多态性有了更清晰的认识。继承使得子类可以继承父类的特性和行为,而多态性则使得同一个方法可以根据不同的对象表现出不同的行为。理解并熟练运用这两个概念,对于编写高质量的面向对象程序至关重要。希望本文能为你今后的学习之路打下坚实的基础!

目录
相关文章
|
5月前
|
存储 安全 数据库连接
C#深度揭秘:常量的魅力和实践,一文让你从新手到专家
C#深度揭秘:常量的魅力和实践,一文让你从新手到专家
45 0
|
5月前
|
网络协议 API C#
C# 中模拟 POST 和 GET 请求的原理与实践
【1月更文挑战第4天】在现代网络应用中,HTTP请求是客户端与服务器交互的基础。其中,GET和POST是最常用的两种请求方法。本文将介绍如何使用C#语言模拟这两种请求,并解释其背后的工作原理。我们将利用.NET框架中的HttpClient类来发送请求,并处理服务器的响应。通过本文,读者将能够理解HTTP请求的基本构成,学会在C#中编写代码来模拟这些请求,进而在开发过程中实现与Web服务的交互。
|
2月前
|
开发框架 安全 .NET
|
15天前
|
安全 C#
C# 面向对象编程的三大支柱:封装、继承与多态
【9月更文挑战第17天】在C#中,面向对象编程的三大支柱——封装、继承与多态,对于编写安全、可维护、可复用的代码至关重要。封装通过访问修饰符和属性保护数据;继承允许子类继承父类的属性和方法,实现代码复用和多态;多态则提高了代码的灵活性和通用性。掌握这三大概念能显著提升C#编程能力,优化开发效率和代码质量。
|
14天前
|
SQL 开发框架 安全
并发集合与任务并行库:C#中的高效编程实践
在现代软件开发中,多核处理器普及使多线程编程成为提升性能的关键。然而,传统同步模型在高并发下易引发死锁等问题。为此,.NET Framework引入了任务并行库(TPL)和并发集合,简化并发编程并增强代码可维护性。并发集合允许多线程安全访问,如`ConcurrentQueue<T>`和`ConcurrentDictionary<TKey, TValue>`,有效避免数据不一致。TPL则通过`Task`类实现异步操作,提高开发效率。正确使用这些工具可显著提升程序性能,但也需注意任务取消和异常处理等常见问题。
26 1
|
2月前
|
C#
C#中的类和继承
C#中的类和继承
36 6
|
2月前
|
C# 索引
C# 面向对象编程(二)——继承
C# 面向对象编程(二)——继承
30 0
|
2月前
|
存储 自然语言处理 C#
SemanticKernel/C#:检索增强生成(RAG)简易实践
SemanticKernel/C#:检索增强生成(RAG)简易实践
62 0
|
5月前
|
存储 C# 开发者
掌握 C#编程:关键技术与实践
【4月更文挑战第20天】掌握C#编程的关键技术,包括面向对象编程、数据类型、控制流、异常处理、集合泛型、委托事件和异步编程。通过学习基础、实践项目、代码调试、参考优秀代码、社区交流和持续学习来提升技能。注重代码质量,以开发高质量应用程序。
32 2