[编程语言][C#]C#语言之坑——隐藏继承自父类的属性

C#继承之隐藏基类方法 C#继承之隐藏基类方法或其他信息 当我们在定义一个类并继承了其它类的时候,在派生类中是没有办法删除基类的任何成员,就像我们不能改变父母的基因一样,所能做的只能采用隐藏父类方法,也就像使基因变为隐性基因。具体方式如下: 屏蔽数据成员:在派生类中声明名称和类型相同的成员 屏蔽函数成员:在派生类中声明新的函数签名相同的成员 让编译器知道:在派生类中声明新的函数签名相同的成员前 阅读详情

C#语言之坑——隐藏继承自基类的属性

问题

C#语言的继承机制,使得基类的所有公有属性都包含在派生类中。在某种场景下,是不允许类的使用者直接访问这些继承自基类的属性,但语言本身无法直接隐藏这些属性。

场景

长方形类具有公共属性Width和Height,正方形类继承自长方形类。此时,如果正方形类继续提供公共属性Width和Height就不合适了,应该另外提供公共属性SideLength。

解决方案

使用类ChildClass3的设计方式解开间接隐藏继承自基类的公共属性。

using System;

namespace ConsoleApp1
{
	internal class Program
	{
		static void Main(string[] args)
		{
			ParentClass parent = new()
			{
				Message = "This is ParentClass"
			};

			ChildClass1 class1 = new()
			{
				Message = "This is ChildClass 1"
			};

			ChildClass2 child2 = new()
			{
				Message = "This is ChildClass 2"
			};

			ChildClass3 child3 = new()
			{
				// 无法为属性或索引器“ChildClass3.Message”赋值 - 它是只读的
				//Message = "This is ChildClass 3"

				ChildMessage = "This is ChildClass 3"
			};
			
			ChildClass4 child4 = new()
			{
				// 此处依然可访问到基类的Message
				Message = "This is ChildClass 3"
			};
		}
	}

	class ParentClass
	{
		private string _Message = string.Empty;
		public string Message
		{
			get
			{
				return _Message;
			}
			set
			{
				_Message = value;
				Console.WriteLine($"[Parent] Message: {_Message}");
			}
		}
	}

	class ChildClass1 : ParentClass
	{

	}

	class ChildClass2 : ParentClass
	{
		private string _Message = string.Empty;
		public new string Message
		{
			get
			{
				return _Message;
			}
			set
			{
				_Message = value;
				Console.WriteLine($"[Child] Message: {_Message}");
			}
		}
	}

	class ChildClass3 : ParentClass
	{
		// 隐藏基类的属性,拒绝类的使用者直接访问继承自基类的公共属性
		public new string Message { get; } = string.Empty;

		// 重新设计自己的属性,但使用基类的属性存储值
		public string ChildMessage
		{
			get
			{
				return base.Message;
			}
			set
			{
				base.Message = value;
				Console.WriteLine($"[Child] Message: {base.Message}");
			}
		}
	}

	class ChildClass4 : ParentClass
	{
		private string ChildMessage
		{
			get
			{
				return base.Message;
			}
			set
			{
				base.Message = value;
				Console.WriteLine($"[Child] Message: {base.Message}");
			}
		}
	}
}

有个细节问题需要注意:C#中,如果使用关键字new隐藏继承自基类的属性,但同时使用修饰符private则隐藏失败。

C#中的TextBox隐藏和显示属性及示例 在上面的示例中,我们创建了一个Windows窗体应用程序,并在窗体加载事件中动态创建了一个TextBox控件、一个显示按钮和一个隐藏按钮。本文介绍了C#中的TextBox.Visible属性,该属性用于控制TextBox控件在界面上的显示和隐藏。在C#中,TextBox.Visible是一个布尔类型的属性,它决定了TextBox控件是否在界面上可见。通过上述示例,我们可以看到使用C#中的TextBox.Visible属性非常简单,只需将其设置为true或false即可控制TextBox的隐藏和显示。 阅读详情

相关推荐

C#编程语言系统化教学PPT课件

类的定义包括类名、访问修饰符、成员变量和方法。类的成员变量可以是字段、属性或常量。// 字段// 属性// 方法逻辑分析:width和height是私有字段,用于存储矩形的尺寸。Width和Height是公开属性,提供安全的访问方式。GetArea()方法用于计算矩形的面积。继承允许一个类(派生类)从另一个类(基类)继承其成员,从而实现代码复用。set;");逻辑分析:Animal是基类,定义了通用属性和方法。Dog是派生类,继承自。

weixin_42575109的博客 946

C#中自定义控件隐藏基类成员(属性、方法和事件)的方法

编写自定义控件时,总是继承C#中提供的Control类,而Control类是C#中所有窗体控件的基类,里面定义了大量的属性、方法和事件,而很多基类成员在自定义控件中可能不需要,因为编写者会希望在自定义控件中隐藏这些成员,避免使用者调用这些成员。        从面向对象的角度来看,不允许调用子类者访问其基类的公共成员是不可能的,我们不可能去掉或者改写基类的公共成员,即使基类成员是抽象的或是虚的,

XuXuemin的专栏 8632

C#编程语言深度学习指南

C#(发音为"See Sharp")是一种简单、现代、面向对象的编程语言。由微软开发,用于.NET框架中,它于2002年与.NET框架一起首次发布。C#被设计为一种安全、简单、现代的语言,它集合了C和C++的高级编程能力、Delphi的快速应用开发和Visual Basic的易用性。C#快速成为企业级开发环境中的首选语言之一,尤其是在Windows平台的应用开发中。初学者在掌握C#时,需要从其基础语法着手。

weixin_32661831的博客 747

C#如何在派生类中不显示父类的一些属性以及TypeDescriptor使用

public SonClass:FatherClass { 定义属性 。。。。 } Type thisType = typeof(SonClass);方法一: PropertyInfo[] pis = thisType.BaseType.GetProperties();//thisType.BaseType就是FatherClass foreach (PropertyInfo p...

weixin_34208283的博客 611

C#子类舍弃属性转换为父类UtilSubToBase.cs

利用C#反射将子类舍弃多余的属性转换为父类,用途比较少。

百度智能云训练图像分割模型+python调用模型并分割图像

目录 训练模型阶段 发布图像分割API 调用图像分割API 创建应用后显示以下两个代码 在pycharm中可以调用API mask解码 依赖库pycocotools安装步骤: 依赖库urllib2的安装 源码下载: 最近上课听老师介绍了一个训练图像分割模型的网站,把数据集上传之后做图像标注,然后进行训练就能得到准确率等指标。 训练模型阶段 图像分割:https://ai.baidu.com/easydl/vision/ 图像分割-->创建模型-->上传数据--&gt

icecreamdinner的博客 1388

C#编程语言基础10

面向对象之继承 继承概念 在C#中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有的类被称作父类,子类会自动拥有父类除构造方法和析构方法以外的所有成员。 继承关系的相关语法: class 子类:父类 { } 对于继承父类的子类来说,子类可以使用父类中公有的成员。 对于C#来说,子类单继承一个父类,也就是说,C#继承具有单一性。 多个类可以同时继承同一个父类。 在C#中,多层继承是可以的,即一个类的父类可以再去继承其他类,例如C类继承自B类,B类又继承自A类,这时,C类也可称

cyl16688 244

App inventor2通过蓝牙控制Arduino Uno LED开关

App inventer2控制Arduino Uno LED开关 如果学会这个小程序,大部分的手机通过蓝牙控制Arduino的功能都可以实现,这个小示例是通过蓝牙模块向Arduino发送"0"和"1",而其它功能要发送其它不同的字符串内容给Arduino. 所需硬件: Arduino Uno JDY-16 蓝牙模块(我的是蓝牙4.2版本) 草帽LED(可选) 手机(我用的是安卓,苹果手机应该也可以,最近其应用商店也有App inventor(AI)伴侣) 软件: Aduino IDE或者Platfom

Firmin123456的博客 5498

编程语言详细介绍C#中new的几种用法

编程语言详细介绍C#中new的几种用法 本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧 在 C# 中,new 关键字可用作运算符、修饰符或约束。 new 运算符 用于创建对象和调用构造函数。 new 修饰符 用于向基类成员隐藏继承成员。 new 约束 用于在泛型声明中约束可能用作类型参数的参数的类型。 new 修饰符(C# 参考) 在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。隐藏继承的成员意味着该成员的派生版本将替换基类版本。在不使

1万+

解决turmex安装kali报错问题

在手机上安装好turmex后,都喜欢安装一个Linux系统,我当时安装的时kali,但是安装过程中,报错不断。 2019.8.24更新 1,出现问题首先看下载kali源文件是否完整 安装步骤中,会显示[解压中.....] ,可以看到解压的大小。 如图所示,完整源文件不小于81M。 如果源文件过小,则说明下载错误,而且在remove kali这个命令下,是不会删除源文件的,下一次安装只...

WeiLuckyStrike的博客 1万+

特征选择(模型输入参数的分析选择)方法汇总

特征选择是模式识别和机器学习领域的重要研究课题之一。为了提高准确率, 人们往往最大限度地提取特征信息。然而, 过大的特征向量维数不仅导致计算成本的增加, 复杂运算也随之带来分类识别率的下降。因此, 通过合适的特征选择算法, 去除无关特征和冗余特征, 获得有助于分类的最优特征子集, 对提高识别性能和降低计算成本具有重要意义。 特征选择主要有两个功能: 减少特征数量、降维,使模型泛化能力更强,减少过拟合 增强对特征和特征值之间的理解 参考资料: 优快云《几种常用的特征选择方法》 知乎《机器学习中,.

David's Tweet 1万+

【C#】C#面向对象(封装,继承,多态,抽象)

多态是指同一操作在不同对象上具有不同的表现形式.通过多态,可以使用统一的接口来调用不同对象的特定实现抽象是对现实世界复杂对象的建模,提取出关键特性,忽略不必要的细节.抽象可以通过抽象类和接口来实现,提供一个模板,让子类实现特定的功能封装:通过访问修饰符和属性,保护对象的内部状态,提供受控的访问接口继承;子类继承父类的属性和方法,实现代码重用和逻辑扩展多态:通过方法重写和接口实现,实现相同接口的不同表现形式,增强代码的灵活性和可扩展性抽象:通过抽象类和接口,定义对象的抽象模型,强制子类实现特定的行为。

冰茶的博客 1546

DIY T12烙铁头驱动难题:用几个电容二极管,搞定NMOS上管驱动(附Multisim仿真)

本文详细介绍了如何利用电荷泵电路解决DIY T12烙铁头驱动中的NMOS上管驱动难题。通过巧妙组合电容和二极管,构建低成本高效的升压电路,实现栅极高压驱动需求。文章包含具体电路设计、元件选型建议、实际搭建注意事项以及Multisim仿真验证,为电子爱好者提供了一套完整的解决方案。

weixin_33640562的博客 334

C#:强大编程语言的多面魅力

与传统高级语言的相似性,C# 十分接近于传统高级语言 C 和 C++,是一门面向对象的编程语言,与 Java 有许多相似之处,拥有强大的编程功能,因此受到广大程序员的青睐。总之,C# 在实际项目中有广泛的应用,新手在学习 C# 时需要注意了解基本概念和语法、学习.NET 框架、熟悉开发工具、学习数据结构和算法以及了解 C# 在实际项目中的应用。通过整合相关技术,C# 将为开发者提供更加便捷、高效的开发体验,无论是深度学习框架的集成还是机器学习模型的训练和部署,C# 都将提供强大的支持。

热爱技术 4558

Android 12.0 framework系统修改安兔兔等显示的屏幕尺寸大小功能实现

在12.0的系统rom定制化开发中,在使用第三方app检测系统的一些信息中,比如安兔兔 设备信息等检测app中,有时候显示的屏幕尺寸大小和 产品规格书等信息不同,稍微有些差异,所以就需要看下系统framework层中,相关的设备信息是怎么读出来的,然后做些调整 接下来就来分析相关功能

安卓兼职framework和app工程师的博客 477

rk3399开发环境的介绍

由于Bluez的介绍文档有限,以及对Linux 系统/驱动概念、D-Bus 通信和蓝牙协议都有要求,加上网络上其实没有一个完整的介绍Bluez系列的文档,所以不管是蓝牙初学者还是蓝牙从业人员,都有不小的难度,学习曲线也相对较陡,所以我有了这个想法,专门对Bluez做一个系统性的介绍,尽可能的涵盖所有内容。

朝气蓬勃 708

Vala编程语言教程-属性

在面向对象编程中,向类使用者隐藏实现细节是良好的实践(信息隐藏原则),这样您后续可以修改内部实现而不会破坏公共API。一种常见的做法是将字段设为私有,并通过访问器方法(getters 和 setters)提供值的获取和设置。这种方式可行,但Vala提供了更好的解决方案。问题在于这些方法使用起来较为繁琐。这种语法对C#程序员来说应该很熟悉。属性包含get和set代码块来获取和设置值,value是表示新值的保留字。现在您可以像访问公共字段一样使用属性,但实际执行的是get和set。

who_I_am__的博客 634

yolov8涨点系列之Concat模块改进

yolov8涨点系列之Concat模块改进

zhang1379的博客 2950

十大热门编程语言的介绍

小编给大家分享一篇关于现阶段十大热门编程语言的文章:经过流行的搜索引擎,如谷歌,必应,雅虎,维基百科,亚马逊,YouTube和百度,用于计算评级;得出十大热门编程语言排行榜的榜单: 根据百度百科以及网上查阅总结分析以上十大热门编程语言的介绍、特点、前景: 1、Java 基本介绍: Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此J...

农村小白的博客 3万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C#编程语言

C#

YYYMarshal的博客 1410

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C# 继承

C# 类的继承 (1)结构体不能被继承 (2)基类的所有成员都会被派生类继承,但是private继承后不能被访问,其余类型都可以被访问。 (3)类继承时的基类只能有1个,并且必须放在“:”的后面(紧挨着),后面可以跟多个接口 (4)基类方法声明为virtual时,派生类可以利用override重写此方法 public class Xt { int xx; public overrid

eskimoer的专栏 1134

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C#--类之隐藏基类的成员

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication3 { public class BaseClass { ...

a0103122120的博客 620

常用编程语言介绍及各语言特点

常用编程语言及各语言特点 从1946年至今,电脑已经发展了70多年了,从最开始的电子管到如今的个人PC,除了硬件上的更新迭代外,软件的更新即编程语言的发展也是重中之重。 而发展至今的 ...

BlockBook的博客 808

【C# 基础精讲】继承、封装、多态

继承、封装和多态是面向对象编程的核心概念,它们有助于创建更加模块化、可扩展和可维护的代码。继承允许子类继承父类的属性和方法,实现代码的复用和功能的扩展。封装将类的内部实现细节隐藏,通过接口提供对外的访问方式,提高代码的安全性和可维护性。多态允许不同类的对象对相同的消息做出响应,表现出不同的行为,提供了更加灵活的调用方式。这三个概念在C#中得到了广泛的应用,通过深入理解它们的含义和应用,您将能够编写出更加优雅、健壮的面向对象程序。

繁依Fanyi的博客 1708

什么是c#面向对象的开发语言,C#及面向对象编程语言.pdf

2 章 C#与面向对象编程语言阅读目标树立面向对象设计思想理解封装、继承、抽象、多态的概念学会如何识别系统中的对象2.1 面向对象思想面向对象思想为软件设计与开发赋予了哲学的意义。在哲学的世界里,小至沙粒微尘,大至日月星辰乃至宇宙,均可视为单独的个体对象而存在。如果以哲学的目光凝视程序的世界,又何尝不是如此?一个用户,一种销售策略,一条消 ,一张订单,一个Web 网页……,运用面向对象思想,则它...

weixin_34910865的博客 253

C#面向对象编程:动物类继承实战

本文介绍了C#面向对象编程的核心概念封装和继承,通过动物类案例进行实践。主要内容包括:1)创建Animal父类定义公共字段和构造方法;2)Ji和Dog子类继承父类,通过private封装字段,重写ToString实现自定义输出;3)演示base调用父类构造方法、属性封装数据等关键语法。案例完整展示了面向对象继承复用代码和封装保护数据的优势,是C#基础开发的重要实践。

dhhdfv的博客 299
上一篇: 欢迎使用Markdown编辑器
下一篇: [编程语言][C++][Qt]CMake给Windows可执行程序添加图标
cloudblaze
博客等级 码龄17年 81粉丝 125原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值