[编程语言][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则隐藏失败。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值