【C#】面向对象的三大特性,还记得吗,简单代码举例回顾

欢迎来到《小5讲堂》
大家好,我是全栈小5。
这是《C#》序列文章,每篇文章将以博主理解的角度展开讲解,
特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。
温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!

在这里插入图片描述

目录

  • 基本概念
  • 封装
  • 继承
  • 多态
  • 话题

基本概念

C# 面向对象的三大特性是封装、继承和多态。

  • 封装
    指将对象的某些内部状态和行为封装起来,只暴露必要的接口供其他对象使用,并且隐藏其实现细节,从而保证了对象的安全性和可维护性。

  • 继承
    指通过继承一个已有的类来创建一个新类,新类继承了父类的属性和方法,并可以新增或重写一些方法,从而在代码复用和扩展性方面提供了便利。

  • 多态
    指同一种类型的对象,在不同的情况下,可以有不同的状态和行为。在面向对象编程中,多态通常通过继承和接口实现。

封装

假设Person 类定义了两个私有字段 name 和 age,它们被封装在类的内部,外部无法直接访问。
为了对外提供对这些私有字段的访问和设置,在类中定义了公开的访问器和设置器 (getter 和 setter)。

通过访问器 (getter),可以获取私有字段的值;通过设置器 (setter),可以给私有字段赋值。
这样,可以在类的外部使用这些访问器和设置器来访问和修改私有字段的值,同时可以在访问和设置的过程中加入相应的逻辑控制。

在 Main 方法中,创建了一个 Person 对象,使用设置器给对象的 name 和 age 字段赋值,然后使用 ShowInfo() 方法来展示这些字段的值。
通过封装,将字段的访问和修改限制在了类的内部,避免了直接操作字段的不良影响,并提供了控制和保护字段的能力。

using System;

// 定义一个类
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 ShowInfo()
    {
        Console.WriteLine($"姓名:{name},年龄:{age}");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Person person = new Person();
        person.Name = "张三";
        person.Age = 25;
        person.ShowInfo();  // 输出:姓名:张三,年龄:25
    }
}

继承

假设Vehicle 类是一个父类,拥有一个构造函数和一个 ShowInfo() 方法。
Car 类则是 Vehicle 类的子类,通过继承 Vehicle 类,Car 类继承了父类的属性和方法,并添加了自己的私有字段 price 和 ShowPrice() 方法。

在 Main 方法中,创建了一个 Car 对象,并调用了其父类继承的 ShowInfo() 方法和自己添加的 ShowPrice() 方法。
通过继承,可以直接使用父类的代码,减少了重复编写相似代码的工作量,并且可以根据需求在子类中进行功能扩展。

using System;

// 定义一个父类
class Vehicle
{
    protected string brand;
    protected int year;

    public Vehicle(string brand, int year)
    {
        this.brand = brand;
        this.year = year;
    }

    public void ShowInfo()
    {
        Console.WriteLine($"品牌:{brand},年份:{year}");
    }
}

// 定义一个子类,继承自父类
class Car : Vehicle
{
    private int price;

    public Car(string brand, int year, int price) : base(brand, year)
    {
        this.price = price;
    }

    public void ShowPrice()
    {
        Console.WriteLine($"价格:{price}万元");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Car car = new Car("奥迪", 2022, 30);
        car.ShowInfo();   // 输出:品牌:奥迪,年份:2022
        car.ShowPrice();  // 输出:价格:30万元
    }
}

多态

假设Animal 类定义了一个虚方法 MakeSound(),并且该方法被派生类 Dog 和 Cat 分别重写了。
当分别使用 Animal、Dog 和 Cat 类型的对象调用 MakeSound() 方法时,根据对象的实际类型,运行时会自动选择适当的方法去执行。
这就是多态的体现,同一种类型的对象在不同的情况下表现出不同的行为。

using System;

// 定义一个动物类
class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("动物发出声音");
    }
}

// 定义一个狗类,继承自动物类
class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("狗叫:汪汪汪!");
    }
}

// 定义一个猫类,继承自动物类
class Cat : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("猫叫:喵喵喵!");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Animal animal1 = new Animal();  // 创建动物对象
        Animal animal2 = new Dog();     // 创建狗对象
        Animal animal3 = new Cat();     // 创建猫对象

        animal1.MakeSound();  // 输出:动物发出声音
        animal2.MakeSound();  // 输出:狗叫:汪汪汪!
        animal3.MakeSound();  // 输出:猫叫:喵喵喵!
    }
}

话题

面向对象编程有三大特性:封装、继承和多态。
许多编程语言都支持面向对象编程,并提供了对应的特性和机制。

  1. Java
    Java 是一种广泛使用的面向对象编程语言,它完全支持封装、继承和多态。

  2. C++:
    C++ 是一种通用编程语言,也支持面向对象编程。它不仅支持封装、继承和多态,还提供了更多高级特性,如模板和运算符重载。

  3. Python
    Python 是一种简单易学的编程语言,同样支持面向对象编程。它提供了类和对象的概念,以及封装、继承和多态的支持。

  4. C#
    C# 是微软公司开发的一种面向对象编程语言。它与 Java 类似,支持封装、继承和多态。

  5. Ruby
    Ruby 是一种动态、脚本化的面向对象编程语言。它非常注重简洁和可读性,同样提供了封装、继承和多态的支持。

除了上述语言,还有许多其他编程语言支持面向对象编程,如JavaScript、PHP、Swift 等。
不同的编程语言可能在语法和使用方式上有所差异,但它们共享面向对象编程的核心概念和特性。

温故而知新,不同阶段重温知识点,会有不一样的认识和理解,博主将巩固一遍知识点,并以实践方式和大家分享,若能有所帮助和收获,这将是博主最大的创作动力和荣幸。也期待认识更多优秀新老博主。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/326059.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读 Vision Transformer - VIT

文章目录 1 摘要1.1 核心 2 模型架构2.1 概览2.2 对应CV的特定修改和相关理解 3 代码4 总结 1 摘要 1.1 核心 通过将图像切成patch线形层编码成token特征编码的方法,用transformer的encoder来做图像分类 2 模型架构 2.1 概览 2.2 对应CV的特定修改和相关理解 解…

程序员应该学习的 10 件事

程序员应该学习的 10 件事(省流版) 翻译:10 Things Software Developers Should Learn about Learning 原文:https://cacm.acm.org/magazines/2024/1/278891-10-things-software-developers-should-learn-about-learning/fulltex…

【教学类-43-21】完结篇 16宫格(4*4可算全部数字)

作品展示: 16宫格里面的4*4小格子可以凑满1-16,旁边的7宫格格2份 背景需求: 做完了1-20宫格的A4模板,最后做一个16宫格小格子(附加7宫格2套)的样式,只有4宫格(2*2)、9宫…

vue3二次封装element-ui中的table组件

为什么要做这件事 借助封装table组件的过程来巩固一下vue3相关知识点。 组件有哪些配置项 options:表格的配置项data: 表格数据源elementLoadingText:加载文案elementLoadingSpinner:加载图标elementLoadingBackground:背景遮罩的颜色elem…

【RabbitMQ】RabbitMQ高级:死信队列和延迟队列

目录 设置TTL(过期时间)概述RabbitMQ使用TTL原生API案例springboot案例 死信队列概述原生API案例springboot案例 延迟队列概述插件实现延迟队列安装插件代码 TTL实现延迟队列实现延迟队列优化 设置TTL(过期时间) 概述 在电商平台…

Netty开篇——NIO章下(五)

SelectionKey 表示 Selector 和网络通道的注册关系&#xff0c;共四种(全是常量): Int OP_ACCEPT:有新的网络连接可以接受&#xff0c;值为 16 &#xff08;1 << 4&#xff09;Int OP_CONNECT: 代表连接已经建立&#xff0c;值为 8 &#xff08;1 << 3&#xff09;…

#AIGC#text2video文生视频,开源DragNUWA:通过集成文本、图像和轨迹对视频生成进行细粒度控制

DragNUWA&#xff1a;通过集成文本、图像和轨迹对视频生成进行细粒度控制 论文地址&#xff1a;https://arxiv.org/abs/2308.08089 DragNUWA 使用户能够直接操纵图像中的背景或对象&#xff0c;模型将这些动作无缝地转换为相机运动或对象运动&#xff0c;生成相应的视频。 Drag…

linux基础学习(3):挂载

挂载可以理解为给磁盘空间一个可访问的入口&#xff0c;那个入口称为挂载点&#xff0c;相当于windows中的盘符。 1.挂载命令mount 1.1直接输入mount 查看系统已挂载的设备 1.2挂载与卸载命令 mount -t 文件系统名 设备文件名 挂载点 | umount 挂载点 或 umount 设…

机器学习——支持向量机SVM

1 摘要&#xff1a; 支持向量机&#xff08;SVM&#xff09;是一种二类分类模型&#xff0c;其基本模型是在特征空间上找到最佳的分离超平面使得训练集上正负样本间隔最大&#xff0c;间隔最大使它有别于感知机&#xff0c;支持向量机也可通过核技巧使它成为非线性分类器。支持…

防火墙部署安全区域

目录 为什么需要安全区域在防火墙上如何来区分不同的网络将接口划分到安全区域安全区域、受信任程度与安全级别安全域间、安全策略与报文流动的方向 安全区域配置案例 为什么需要安全区域 防火墙主要部署在网络边界起到隔离的作用 在防火墙上如何来区分不同的网络 防火墙通过安…

MobaXterm无法上传文件处理

ssh能成功通过mobaxterm连接虚拟机但sftp上传失败的解决办法 1、出现问题时&#xff0c;/etc/ssh/sshd_config的配置文件关于sftp的这行下图所示的情况 2、更改配置文件/etc/ssh/sshd_config的配置文件关于sftp为“internal-sftp”。 3、执行命令systemctl restart sshd&…

leetcode82. 删除排序链表中的重复元素 II

文章目录 题目思路1复杂度Code2 思路2复杂度2Code2 题目 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,3,4,4,5] 输出&#xff1a;…

10.云原生之在线开发调试

云原生专栏大纲 文章目录 vscode-server介绍VSCode Server 和云开发结合vscode-server安装code-server安装插件在线安装插件离线安装插件安装中文插件 配置开发环境在容器中安装开放环境Dockerfile制作镜像 git拉取项目 vscode-server介绍 VSCode Server&#xff08;Visual S…

C++ 编程需要什么样的开发环境?

C 编程需要什么样的开发环境&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#…

k8s之pod基础(下)

k8s之pod基础&#xff08;下&#xff09; 存活探针和就绪探针&#xff0c;会伴随整个pod的生命周期 就绪探针的特点&#xff1a;pod的状态是running&#xff0c;ready状态是notready&#xff0c;容器不可以提供正常的业务访问&#xff0c;就绪探针不会重启容器 就绪探针exec的…

闲鱼宝库亮相!闲鱼商品详情关键词搜索电商API接口助你畅享无尽好货!

随着互联网的快速发展&#xff0c;电商平台的崛起已经改变了人们的购物习惯。而在众多电商平台中&#xff0c;闲鱼作为一款社区二手交易平台&#xff0c;一直备受用户喜爱。如今&#xff0c;闲鱼宝库正式亮相&#xff0c;为用户带来了更加全面、详细的商品详情关键词搜索电商AP…

IP地址冲突警告!你的网络正在受到威胁

IP地址冲突是网络安全中的一个严重问题&#xff0c;可能导致网络不稳定、数据泄漏等严重后果。本文将深入探讨IP地址冲突的原因、影响以及如何应对&#xff0c;以提醒用户关注网络安全问题。 1. IP地址冲突的原因&#xff1a; 动态分配问题&#xff1a;在使用动态IP地址分配的…

开发需求总结9-el-tree获取选中节点,节点全选时返回被全选子级的父节点,未全选则返回被选中的节点

目录 需求描述 代码实现&#xff1a; 需求描述 需要获取树组件选中的节点&#xff0c;假如父节点被选中&#xff08;该节点全选&#xff09;&#xff0c;即只返回父节点的数据&#xff0c;如父节点未被全选&#xff0c;则正常返回被选中节点的数据。 示例一&#xff1a; 如上图…

大众点评评论采集软件使用教程

导出字段&#xff1a; 店铺ID 评论ID 发布时间 人均消费 评分 详情链接 点赞数 浏览数 评论数 最后更新时间 发布平台 推荐 评论详情 原始评论 图片数 图片链接 用户等级 用户名称 用户头像 VIP 私

农业无人机行业分析:单年内作业量突破13亿亩次

面对我国18亿亩的耕地植保市场需求&#xff0c;未来我国植保无人机将依然保持快速发展态势&#xff0c;预计2022年我国植保无人机销量将增长至8万架。 植保无人机市场呈现爆发式增长&#xff0c;同时也吸引了不少企业进入&#xff0c;我们从2022年植保无人机企业网络热度榜中可…