我是靠谱客的博主 震动自行车,这篇文章主要介绍[编程语言][C#]C#语言之坑——隐藏继承自父类的属性问题场景解决方案,现在分享给大家,希望可以做个参考。

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

  • 问题
  • 场景
  • 解决方案

问题

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

场景

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

解决方案

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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#]C#语言之坑——隐藏继承自父类的属性问题场景解决方案的全部内容,更多相关[编程语言][C#]C#语言之坑——隐藏继承自父类内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(73)

评论列表共有 0 条评论

立即
投稿
返回
顶部