C#系列-面向对象特性继承封装多态(2)

  1. C#继承

 C#中,继承是面向对象编程的一个核心概念,它允许一个类(派生类或子类)继承另一个类(基类或父类)的属性和方法。通过继承,子类可以重用基类的代码,同时还可以添加新的成员或重写基类的成员。

以下是一个简单的C#继承示例:

csharp代码

// 基类(父类)

public class Animal

{

public void Eat()

{

Console.WriteLine("The animal eats.");

}

public void Sleep()

{

Console.WriteLine("The animal sleeps.");

}

}

// 派生类(子类)

public class Dog : Animal

{

// Dog类继承了Animal类的所有公共和保护成员

// 因此,Dog类可以直接使用Eat和Sleep方法

// Dog类可以添加新的成员

public void Bark()

{

Console.WriteLine("The dog barks.");

}

}

class Program

{

static void Main(string[] args)

{

// 创建Dog类的实例

Dog myDog = new Dog();

// 调用继承自Animal类的方法

myDog.Eat(); // 输出: The animal eats.

myDog.Sleep(); // 输出: The animal sleeps.

// 调用Dog类特有的方法

myDog.Bark(); // 输出: The dog barks.

}

}

在这个例子中,Dog 类继承自 Animal 类。这意味着 Dog 类拥有 Animal 类中定义的所有公共和保护成员(在这个例子中是 Eat  Sleep 方法)。此外,Dog 类还可以定义它自己的新成员(在这个例子中是 Bark 方法)。

C#还支持以下类型的继承:

  • 公有继承(Public Inheritance:这是最常见的继承类型,在公有继承中,基类的公有和保护成员在派生类中保持原有的访问级别。
  • 保护继承(Protected Inheritance:在保护继承中,基类的公有和保护成员在派生类中成为保护成员。
  • 私有继承(Private Inheritance:在私有继承中,基类的公有和保护成员在派生类中成为私有成员。这种继承类型在C#中并不直接支持,但可以通过其他方式模拟。

C#中,默认的继承方式是公有继承。另外,请注意,C#不支持多重继承,即一个类不能直接继承多个基类。但是,C#支持接口的多重实现,这可以作为一种实现类似多重继承效果的方式。

继承有助于组织代码,促进代码重用,并允许你创建更特定和复杂的对象层次结构。然而,过度使用继承可能导致代码变得难以理解和维护,因此在使用继承时需要谨慎考虑。

2.C#封装

 在面向对象编程中,封装(Encapsulation)是一种将对象的属性和行为(即数据和方法)结合在一个单独的实体(即对象)中的过程。封装的主要目的是隐藏对象的内部状态,只通过对象提供的方法来访问和修改这些状态。这样可以确保对象的完整性和安全性,同时使得代码更加模块化和可维护。

C#中,封装通常是通过定义类来实现的。类定义了一个数据类型,包含数据成员(字段或属性)和方法成员(方法或事件)。类的用户(客户端代码)可以通过对象实例来访问类的公共接口,但不能直接访问对象的内部数据或实现细节。

以下是一个简单的C#封装示例:

csharp代码

// 定义一个简单的类,实现封装

public class BankAccount

{

// 私有字段,表示账户余额

private decimal balance;

// 公共属性,提供对余额的访问和修改

public decimal Balance

{

get { return balance; }

set

{

// 可以在这里添加逻辑来验证值的有效性

if (value >= 0)

{

balance = value;

}

else

{

throw new ArgumentException("Balance cannot be negative.");

}

}

}

// 公共方法,表示存款

public void Deposit(decimal amount)

{

if (amount > 0)

{

balance += amount;

}

else

{

throw new ArgumentException("Deposit amount must be positive.");

}

}

// 公共方法,表示取款

public void Withdraw(decimal amount)

{

if (amount > 0 && balance >= amount)

{

balance -= amount;

}

else

{

throw new InvalidOperationException("Insufficient balance or invalid withdrawal amount.");

}

}

}

class Program

{

static void Main(string[] args)

{

// 创建BankAccount类的实例

BankAccount account = new BankAccount();

// 使用公共接口进行交互

account.Balance = 1000; // 设置初始余额

account.Deposit(500); // 存款

account.Withdraw(200); // 取款

// 无法直接访问私有字段balance

// decimal balanceValue = account.balance; // 这将导致编译错误

// 但可以通过公共属性访问余额

Console.WriteLine("Current balance: " + account.Balance);

}

}

在这个例子中,BankAccount 类封装了账户余额(balance)这个私有字段,并提供了一个公共属性(Balance)来安全地访问和修改它。此外,还提供了DepositWithdraw方法来修改余额。客户端代码(Main方法)通过创建BankAccount类的实例并使用其公共接口来与账户进行交互,而不需要了解账户余额是如何内部存储或管理的。

封装有助于保护对象的内部状态免受外部代码的意外修改,并使得类的实现细节更加安全和可维护。通过将数据和操作封装在一起,可以创建出更加健壮和易于使用的对象。

3.C#多态

 在面向对象编程中,多态(Polymorphism)是一种允许你使用父类类型的引用或接口来引用子类对象的能力。当引用被调用时,将执行与引用所绑定对象的实际类型相对应的方法。这意味着,即使引用是父类类型,也可以调用子类特有的方法。多态允许我们编写更加通用和可重用的代码,因为我们可以编写操作父类类型引用的代码,而无需关心实际对象的具体类型。

C#中,多态通常通过以下方式实现:

  1. 方法重写(Method Overriding):子类可以重写父类中的虚方法(virtual)、抽象方法(abstract)或覆盖方法(override)。当子类对象被当作父类类型引用时,调用该方法将会执行子类中的重写版本。
  2. 方法隐藏(Method Hiding):子类可以隐藏父类中具有相同名称的方法。这不同于重写,因为隐藏方法不会覆盖父类方法,而是创建了一个新的方法。
  3. 方法重载(Method Overloading):在同一个类中,可以定义多个具有相同名称但参数列表不同的方法。编译器根据调用时提供的参数来确定要调用哪个方法。
  4. 接口实现(Interface Implementation):类可以实现一个或多个接口,并提供接口中定义的方法的具体实现。这使得可以通过接口引用来调用实现类中的方法。

下面是一个简单的C#多态示例:

csharp代码

// 定义一个动物基类

public class Animal

{

public virtual void Speak()

{

Console.WriteLine("The animal speaks.");

}

}

// 定义一个狗类,继承自动物基类并重写Speak方法

public class Dog : Animal

{

public override void Speak()

{

Console.WriteLine("The dog barks.");

}

}

// 定义一个猫类,继承自动物基类并重写Speak方法

public class Cat : Animal

{

public override void Speak()

{

Console.WriteLine("The cat meows.");

}

}

class Program

{

static void Main(string[] args)

{

// 创建一个Animal类型的数组,用于存储不同类型的动物对象

Animal[] animals = new Animal[2];

// 创建Dog和Cat对象,并赋值给数组

animals[0] = new Dog();

animals[1] = new Cat();

// 遍历数组,调用每个动物的Speak方法

foreach (var animal in animals)

{

animal.Speak(); // 这里将调用相应对象类型的Speak方法,实现多态

}

}

}

在这个例子中,Animal 类定义了一个虚方法 Speak,而 Dog  Cat 类重写了这个方法。在 Main 方法中,我们创建了一个 Animal 类型的数组,并存储了 Dog  Cat 的对象。当我们遍历这个数组并调用每个对象的 Speak 方法时,会根据实际对象的类型(Dog  Cat)来执行相应的方法,这就是多态的体现。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高考志愿填报模拟系统的功能和技术总结

一、金秋志愿高考志愿填报系统主要功能: 用户注册与登录:允许学生和家长注册账号,使用注册的账号登录系统。 个人信息管理:允许用户查看、修改个人信息,如姓名、性别、联系方式等。 高考成绩输入:学生输…

windows上卸载完程序后,清理残余文件,无法删除的情况处理

现象:通常在卸载完软件后,要删除残余文件或者移动残余文件时候,会弹出来 原因: 因为文件被其他程序已经加载,处理的目标是找到使用这个文件的进程,然后kill掉。类似于linux上的lsof命令查找到进程号&…

SpringOne2023解读-01-使用spring-cloud-contract与TestContainer构建可靠程序

个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判。如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交…

如何在vue中使用拖动排序组件sortablejs

效果图&#xff1a; 1.首先&#xff0c;我们需要在vue项目中安装依赖&#xff1a; npm install -save sortablejs2.创建demo文件>demoTest.vue&#xff0c;直接附上实例代码&#xff1a; <template><div><div id"table-names"><div class&…

如何使用CLZero对HTTP1.1的请求走私攻击向量进行模糊测试

关于CLZero CLZero是一款功能强大的模糊测试工具&#xff0c;该工具可以帮助广大研究人员针对HTTP/1.1 CL.0的请求走私攻击向量进行模糊测试。 工具结构 clzero.py - 工具主脚本&#xff1b; default.py - 包含了大多数标准攻击测试方法和字符&#xff1b; exhaustive.py - 包…

山西电力市场日前价格预测【2024-02-08】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-02-08&#xff09;山西电力市场全天平均日前电价为200.58元/MWh。其中&#xff0c;最高日前电价为347.58元/MWh&#xff0c;预计出现在07:00。最低日前电价为0.00元/MWh&#xff0c;预计出…

Redhat7.9/Centos7.9配置双网卡bonding

一、网卡bonding及其7种模式简介&#xff1a; 1、网卡bonding&#xff1a; 一台服务器如果只有一块网卡&#xff0c;当这块网卡故障时&#xff0c;服务器网络就会瘫痪。bonding&#xff08;绑定&#xff09;是一种Linux系统下的网卡绑定技术&#xff0c;是Linux系统内核层面实…

蓝桥杯第八届省赛题笔记------基于单片机的电子钟程序设计与调试

题目要求&#xff1a; 一、基本要求 1.1 使用 CT107D 单片机竞赛板&#xff0c;完成“电子钟”功能的程序设计与调试&#xff1b; 1.2 设计与调试过程中&#xff0c;可参考组委会提供的“资源数据包”&#xff1b; 1.3 Keil 工程文件以准考证号命名&#xff0c;保存在…

RibbonOpenFeign源码(待完善)

Ribbon流程图 OpenFeign流程图

python3实现gitlab备份文件上传腾讯云COS

gitlab备份文件上传腾讯云COS 脚本说明脚本名称&#xff1a;upload.py 假设gitlab备份文件目录&#xff1a;/opt/gitlab/backups gitlab备份文件格式&#xff1a;1706922037_2024_02_06_14.2.1_gitlab_backup.tar1.脚本需和gitlab备份文件同级目录 2.根据备份文件中的日期判断…

C++面向对象编程:explicit关键字

explicit关键字的作用就是防止有一个参数的类构造函数进行隐式自动转换。 所以explicit只能用于修饰只有一个参数的类构造函数,表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)。 explicit…

Yii特性

Yii几乎拥有了当今Web 2.0应用发展的全部特性。下面是这些特性的一个简短的清单。 模型-视图-控制器&#xff08;MVC&#xff09;设计模式&#xff1a;Yii在WEB编程中采用这一成熟的技术从而可以更好的将逻辑层和表现层分开。数据库访问对象&#xff08;DAO&#xff09;和Acti…

Unity学习笔记之【IK反向动力学操作】

反向动力学Inverse Kinematics 反向动力学&#xff0c;简称IK。相较于正向动力学&#xff0c;反向动力学旨在子级对父级产生的影响。 使用IK&#xff0c;可以实现根据目标位置或方向来计算并调整角色的关节&#xff08;骨骼&#xff09;链&#xff0c;以使角色的末端&#xff…

一、OpenAI API介绍

Open AI API可以应用到任何的业务场景。 文本生成 创造助理 嵌入数据 语音转化 图片生成 图片输入 1. 核心概念 1.1 Text generation models OpenAI 的文本生成模型(通常被称为generative pre-trained transformers 模型简称&#xff1a;GPT),有GPT-4和G…

Node.js_基础知识(全局变量)

介绍 global&#xff1a;相当于浏览器里的window对象process&#xff1a; 是nodejs用来控制和管理进程的工具 主要方法&#xff1a; cwd&#xff1a;获取当前的工作目录&#xff0c;是执行node命令时候的项目地址。补充&#xff1a;__dirname是被执行的js文件地址。chdir&…

无头浏览器 Puppeteer-案例demo

一、无头浏览器 Puppeteer基础介绍&#xff1a; 我们日常使用浏览器的步骤为&#xff1a; 启动浏览器、打开一个网页、进行交互。而无头浏览器指的是我们使用脚本来执行以上过程的浏览器&#xff0c;能模拟真实的浏览器使用场景。 有了无头浏览器&#xff0c;我们就能做包括但…

(十六)springboot实战——spring securtity的认证流程源码解析

前言 本节内容是关于spring security安全框架认证流程的源码分析&#xff0c;spring security的认证流程主要是在UsernamePasswordAuthenticationFilter过滤器中实现的。我们会通过源码层级的分析&#xff0c;了解清楚spring security的底层是如何实现用户的认证的。 正文 1…

MySQL数据库练习【二】

MySQL数据库练习【二】 一、MySQL基本语法二、建库建表-数据准备三、MySQL经典50题-题目四、MySQL经典50题-答案4.1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数4.2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数4.…

云计算运维1

1、企业服务器LNMP环境搭建 集群&#xff1a;多台服务器在一起作同样的事 。分布式 &#xff1a;多台服务器在一起作不同的事 。 环境准备&#xff1a; 1、设置静态ip&#xff08;NAT模式网关为.2&#xff09; # cat /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE"E…

【多模态大模型】Latent Diffusion:在潜在空间而非像素空间进行操作,从而减少了计算复杂度

Latent Diffusion Stable Diffusion 和 Latent Diffusion扩散模型的成本问题子问题1: 高计算成本和训练复杂度子问题2: 保持生成图像的视觉保真度子问题3: 实现多模态和高分辨率图像合成子问题4: 保持图像质量与细节Latent Diffusion 过程&#xff1a; 总结子问题/子解法1&…