当前位置: 首页 > news >正文

Animal objDog = new Dog()和 Dog objDog = new Dog()的区别

文章目录

  • 1、Animal objDog = new Dog()和 Dog objDog = new Dog()的区别
      • 1. **对象类型(引用类型)**
      • 2. **调用和可用成员**
      • 3. **示例代码来说明**
      • 使用示例
      • 总结
  • 2、Animal objDog = new Dog();不能调用dog的方法和属性是为什么?
      • 原因解析
      • 解决方法
      • 小结


1、Animal objDog = new Dog()和 Dog objDog = new Dog()的区别

在 C# 语言中,Animal objDog = new Dog("棒棒", "黑色", "小黑狗", "排骨");Dog objDog = new Dog("棒棒", "黑色", "小黑狗", "排骨"); 的区别主要体现在对象的类型(引用类型)和可用的成员(方法、属性)。具体来看:

1. 对象类型(引用类型)

  • Animal objDog = new Dog(...)

    • 这里,objDog 是一个父类 Animal 类型的引用,指向了一个 Dog 类型的实例。
    • 因为 objDog 的类型是 Animal,你只能访问在 Animal 类中定义的方法和属性(包括虚拟方法)。
    • 你可以通过 objDog 调用 Animal 中的虚拟方法(如果有重写),但不能直接访问 Dog 类中特有的方法和属性(如果没有显式转换)。
  • Dog objDog = new Dog(...)

    • 这里,objDogDog 类型的引用,指向的是一个 Dog 的实例。
    • 可以访问 Dog 类中所有的方法和属性,包括父类 Animal 中的方法(因为 Dog 继承自 Animal)。

2. 调用和可用成员

  • 使用 Animal 类型引用

    • 只能调用 Animal 中的成员,且如果 Animal 中有虚拟方法并在 Dog 中重写了,实际调用时会执行 Dog 中重写的方法。
    • 例如,如果 Animal 类有一个虚拟方法 Speak(),你可以这样调用:
      objDog.Speak(); // 如果在 Dog 中重写了 Speak() 方法,会调用 Dog 的实现。
      
  • 使用 Dog 类型引用

    • 可以直接调用 Dog 中的所有方法和属性,包括 Animal 类定义的成员。
    • 例如:
      objDog.Bark(); // 直接调用 Dog 类特有的方法
      

3. 示例代码来说明

假设我们有如下类定义:

public class Animal
{public string Name { get; set; }public string Color { get; set; }public Animal(string name, string color){Name = name;Color = color;}public virtual void Speak(){Console.WriteLine($"{Name} speaks!");}
}public class Dog : Animal
{public string Breed { get; set; }public string FavoriteFood { get; set; }public Dog(string name, string color, string breed, string favoriteFood): base(name, color){Breed = breed;FavoriteFood = favoriteFood;}public override void Speak(){Console.WriteLine($"{Name} (a {Breed}) barks!");}public void Bark(){Console.WriteLine($"{Name} is barking!");}
}

使用示例

Animal objDog1 = new Dog("棒棒", "黑色", "小黑狗", "排骨");
objDog1.Speak();  // 输出: 棒棒 (a 小黑狗) barks!
objDog1.Bark();   // 编译错误: objDog1没有Bark方法Dog objDog2 = new Dog("棒棒", "黑色", "小黑狗", "排骨");
objDog2.Speak();  // 输出: 棒棒 (a 小黑狗) barks!
objDog2.Bark();   // 输出: 棒棒 is barking!

总结

  • 使用父类类型的引用(Animal objDog)可以提高程序的灵活性,适合处理多态性,但访问成员的限制较多。
  • 使用子类类型的引用(Dog objDog)允许你访问所有相关成员,适合需要直接使用子类特有功能的场景。

2、Animal objDog = new Dog();不能调用dog的方法和属性是为什么?

在 C# 中,Animal objDog = new Dog(); 这行代码的主要作用是将一个 Dog 对象赋值给一个 Animal 类型的引用变量 objDog。虽然 objDog 实际上引用的是一个 Dog 对象,但由于它的类型是 Animal,你只能访问 Animal 类中定义的方法和属性,而不能调用 Dog 类中特有的方法和属性。

原因解析

  1. 类型限制

    • objDog 被声明为 Animal 类型,因此编译器只允许你访问 Animal 类中定义的 public 和 protected 方法和属性。
    • 即使它在运行时指向一个 Dog 对象,编译器并不知道,除非你将其转换为 Dog 类型。
  2. 方法和属性的可见性

    • 如果 Dog 类中有只在 Dog 类中定义的方法或属性(如 Bark()),这些方法和属性在 Animal 类中是不可见的,因此你无法直接通过 objDog 调用它们。

解决方法

如果你需要调用 Dog 类中特有的方法和属性,可以将 objDog 类型转换为 Dog,如下面的代码示例所示:

public class Animal
{public string Name { get; set; }public string Color { get; set; }public Animal(string name, string color){Name = name;Color = color;}public virtual void Speak(){Console.WriteLine($"{Name} speaks!");}
}public class Dog : Animal
{public string Breed { get; set; }public string FavoriteFood { get; set; }public Dog(string name, string color, string breed, string favoriteFood) : base(name, color){Breed = breed;FavoriteFood = favoriteFood;}public override void Speak(){Console.WriteLine($"{Name} (a {Breed}) barks!");}public void Bark(){Console.WriteLine($"{Name} is barking!");}
}// 使用示例
Animal objDog = new Dog("棒棒", "黑色", "小黑狗", "排骨");
// objDog.Bark(); // 编译错误,因为 Animal 类型没有 Bark 方法// 类型转换
if (objDog is Dog dog)
{dog.Bark(); // 正确调用 Dog 类中特有的方法
}

小结

  • 使用 Animal objDog = new Dog(); 时,objDog 的类型是 Animal,只能使用 Animal 中定义的方法和属性。
  • 若想使用 Dog 类中特有的方法和属性,需要将其转换为 Dog 类型。这可以通过 is 关键字或显式转换来实现。

相关文章:

Animal objDog = new Dog()和 Dog objDog = new Dog()的区别

文章目录 1、Animal objDog new Dog()和 Dog objDog new Dog()的区别1. **对象类型(引用类型)**2. **调用和可用成员**3. **示例代码来说明**使用示例总结 2、Animal objDog new Dog();不能调用dog的方法和属性是为什么?原因解析解决方法小…...

springboot引入netty

配置类 import cn.hutool.core.thread.ThreadUtil; import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.PooledByteBufAllocator; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChanne…...

PWM基础与信号控制

1. 什么是PWM? PWM(Pulse Width Modulation,脉宽调制)是一种通过改变信号的占空比来控制电压输出的技术。简单来说,PWM信号由一系列高低电平组成,通过调节高电平持续的时间比例,可以控制信号的…...

nvm,一款nodejs版本管理工具

背景 在工作中,我们可能同时在进行2个或者多个不同的项目开发,每个项目的需求不同,进而不同项目必须依赖不同版本的NodeJS运行环境,这种情况下,对于维护多个版本的node将会是一件非常麻烦的事情,nvm就是为…...

数据处理与统计分析篇-day11-RFM模型案例

会员价值度模型介绍 会员价值度用来评估用户的价值情况,是区分会员价值的重要模型和参考依据,也是衡量不同营销效果的关键指标之一。 价值度模型一般基于交易行为产生,衡量的是有实体转化价值的行为。常用的价值度模型是RFM RFM模型是根据…...

【PostgreSQL】PostgreSQL数据库允许其他IP连接到数据库(Windows Linux)

要让PostgreSQL数据库允许其他IP连接到数据库,需要进行以下几个步骤的配置: 1. 修改postgresql.conf文件 首先,需要修改PostgreSQL的主配置文件postgresql.conf,允许数据库监听所有IP的连接请求。 1.1 找到postgresql.conf文件…...

通义千问:让我的编程工作效率翻倍的秘密武器

在日益繁忙的工作环境中,选择合适的编程工具已成为提升开发者工作效率的关键。不同的工具能够帮助我们简化代码编写、自动化任务、提升调试速度,甚至让团队协作更加顺畅。在这篇博客中,我将分享一个让我工作效率翻倍的编程工具——通义千问大…...

2.Seata 1.5.2 集成Springcloud-alibaba

一.Seata-server搭建已完成前提下 详见 Seata-server搭建 二.Springcloud 项目集成Seata 项目整体测试业务逻辑是创建订单后(为了演示分布式事务,不做前置库存校验),再去扣减库存。库存不够的时候,创建的订单信息数…...

python 图像绘制问题: 使用turtle库绘制蟒蛇

turtle (海龟)库是turtle绘图体系的python实现。 1969年诞生,主要用于程序设计入门。 import turtle turtle.setup(650, 350, 200, 200) # 设置窗体(宽,高,窗体左上角x坐标,y坐标) turtl…...

大模型分布式训练并行技术(七)-自动并行

近年来,随着Transformer、MOE架构的提出,使得深度学习模型轻松突破上万亿规模参数,传统的单机单卡模式已经无法满足超大模型进行训练的要求。因此,我们需要基于单机多卡、甚至是多机多卡进行分布式大模型的训练。 而利用AI集群&a…...

网络安全等级保护 | 规范企业网络系统安全使用 | 天锐股份助力等保制度落地

在当今数字化高速发展的时代,网络安全对于企业的重要性日益凸显。而近年来,数据泄露、网络攻击等安全事件频发,给企业和个人带来了前所未有的挑战。在这一背景下,网络安全等级保护制度(简称“等保”)作为国…...

Springboot使用redis,以及解决redis缓存穿透,击穿,雪崩等问题

1.Redis面试题-缓存穿透,缓存击穿,缓存雪崩 1 穿透: 两边都不存在(皇帝的新装) (返回空值)(互斥锁)(黑名单) (布隆过滤器) 2 击穿:一个或多个热…...

pve 命令开启关闭虚拟机

命令 #查看集群资源状况 #pvesh get /cluster/resources #取得虚拟机当前状态 #pvesh get /nodes/<节点id>/qemu/<虚拟机id>/status/current #pvesh get /nodes/www/qemu/107/status/current#关闭虚拟机 #pvesh create /nodes/<节点id>/qemu/<虚拟机id&…...

【达梦数据库】临时表的使用测试

目录 背景问题复现问题原因解决方法 背景 用户在使用临时表的过程中&#xff0c;执行commit提交命令之后&#xff0c;临时表的数据被清空&#xff0c;无法被接下来的存储过程复用。 问题复现 -----------------------------提交删除行----------------------------- --创建临…...

【GUI设计】基于Matlab的图像去噪GUI系统(8),matlab实现

博主简介&#xff1a; 如需获取设计的完整源代码或者有matlab图像代码项目需求/合作&#xff0c;可联系主页个人简介提供的联系方式或者文末的二维码。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于Matlab的图像去噪GUI系统&am…...

【计算机科学导论】

计算机科学的本质就是解决问题&#xff0c;我们计算机由输入设备&#xff0c;处理设备和输出设备组成。 处理设备看做一个大黑盒&#xff0c;目的就是接收处理数据&#xff0c;然后发送到输出设备。计算机中存储数据就是2进制&#xff0c;0和1&#xff0c;0代表关&#xff0c;…...

【C++】I/O流的使用介绍

文章目录 什么是 I/O 流&#xff1f;C I/O 流的基本类型常用的 I/O 操作1. 标准输入输出2. 文件输入输出3. 字符串流 什么是 I/O 流&#xff1f; 在 C 中&#xff0c;I/O 流是数据的输入和输出通道。流的本质是一个字节序列&#xff0c;提供了抽象的方式来读写数据。C 使用流对…...

深度学习:(八)深层神经网络参数与流程

深层神经网络 符号规定 L L L &#xff1a;表示神经网络的层数&#xff1b; l l l &#xff1a;表示第几层&#xff1b; n [ l ] n^{[~l~]} n[ l ] &#xff1a;表示第 l l l 层的节点数&#xff1b; a [ l ] a^{[~l~]} a[ l ] &#xff1a;表示第 l l l 层中的激活函数&…...

`pattern = r“(\d+)(CNY|JPY|HKD|EUR|GBP|fen|cents|sen|eurocents|pence)“

pattern r"(\d)(CNY|JPY|HKD|EUR|GBP|fen|cents|sen|eurocents|pence)" 是一个正则表达式&#xff0c;用于匹配特定格式的字符串。 正则表达式解析 整体结构&#xff1a; r"..."&#xff1a;前缀 r 表示这是一个原始字符串&#xff08;Raw String&#x…...

宝塔面板部署雷池社区版教程

宝塔面板部署雷池社区版教程 简单介绍一下宝塔面板&#xff0c;安全高效的服务器运维面板&#xff0c;使用宝塔面板的人非常多 在网站管理上&#xff0c;许多用户都是通过宝塔面板进行管理&#xff0c;宝塔面板的Nginx默认监听端口为80和443&#xff0c;这就导致共存部署时雷池…...

【击败100%】258. 各位相加

首次出现&#xff0c;代码用时击败了100%的用户&#xff0c;开心~ 题目 给定一个非负整数 num&#xff0c;反复将各个位上的数字相加&#xff0c;直到结果为一位数。返回这个结果。 示例 1: 输入: num 38 输出: 2 解释: 各位相加的过程为&#xff1a; 38 --> 3 8 -->…...

【alist】宝塔面板docker里的alist默认admin无法登录

宝塔docker安装完alist&#xff0c;根据页面的提示账号密码死活登录不上&#xff0c;提示密码有问题 页面提示&#xff1a; 数据存储目录 /www/dk_project/dk_app/dk_alist 使用说明请参考&#xff1a; >使用教程 默认账号密码&#xff08;admin/admin) 首次登录后点击个人…...

【击败100%】1281. 整数的各位积和之差

击败了100%的用户&#xff0c;开心~ 题目 给你一个整数 n&#xff0c;请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。 示例 1&#xff1a; 输入&#xff1a;n 234 输出&#xff1a;15 解释&#xff1a; 各位数之积 2 * 3 * 4 24 各位数之和 2 3 4 …...

Flink基本概念和算子使用

基础概念 Flink是一个框架和分布式处理引擎&#xff0c;用于对无界数据流和有界数据流进行有状态计算&#xff0c;它的核心目标是“数据流上的有状态计算”。 有界流和无界流 有界流&#xff1a;具有明确的开始和结束时间&#xff0c;数据量有限。适合使用批处理技术&#xf…...

Kafka 3.0.0集群部署教程

1、集群规划 主机名 ip地址 node.id process.roles kafka1 192.168.0.29 1 broker,controller Kafka2 192.168.0.30 2 broker,controller Kafka3 192.168.0.31 3 broker,controller 2、将kafka包上传以上节点/app目录下 mkdir /app 3、解压kafka包 所有节点 …...

昇思MindSpore进阶教程-格式转换

大家好&#xff0c;我是刘明&#xff0c;明志科技创始人&#xff0c;华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享&#xff0c;如果你也喜欢我的文章&#xff0c;就点个关注吧 MindSpore中可以把用于训练网络模型的数据…...

搜索软件 Everything 的安装与使用教程

一、Everything简介 适用于 Windows 的免费搜索工具 Everything 是 Windows 的即时搜索引擎。发现、整理并轻松访问文件和文件夹&#xff0c;一切尽在指尖&#xff01; PS&#xff1a;Everything无法对文件内容进行搜索&#xff0c;只能根据文件名和路径进行搜索 二、Everyt…...

oracle 如何判断当前时间在27号到当月月底

在Oracle中&#xff0c;您可以使用TRUNC和LAST_DAY函数来判断当前时间是否在27号到当月月底之间。以下是一个SQL示例&#xff1a; SELECT CASE WHEN TRUNC(SYSDATE) > TRUNC(SYSDATE, DD) 26 AND TRUNC(SYSDATE) < LAST_DAY(SYSDATE) THEN 当前时间在27号到当月月底之间…...

Django 配置邮箱服务,实现发送信息到指定邮箱

一、这里以qq邮箱为例&#xff0c;打开qq邮箱的SMTP服务 二、django项目目录设置setting.py 文件 setting.py 添加如下内容&#xff1a; # 发送邮件相关配置 EMAIL_BACKEND django.core.mail.backends.smtp.EmailBackend EMAIL_USE_TLS True EMAIL_HOST smtp.qq.com EMAIL…...

Git使用手册

1、初识Git 概述&#xff1a;Git 是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理项目版本管理。 知识点补充&#xff1a; 版本控制&#xff1a;一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。 分布式&#xff1a;每个人…...