[.NET] 建构子中传递子对象的对象

在设计对象继承的时候,父对象建构子会需要一些参数,这些参数可以由子对象建构子透过base关键词来提供。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
namespace Test001
{
    public class ParentClass
    {
        // Constructors
        public ParentClass(IEnumerable<string> dataCollection)
        {
            this.DataCollection = dataCollection;
        }
 
 
        // Properties
        public IEnumerable<string> DataCollection { get; private set; }
    }
 
    public class ChildClass : ParentClass
    {
        // Constructors
        public ChildClass() : base(new List<string>()) { }
    }
}

但是如果子对象,要使用这个传递给父对象的参数,就需要一点小技巧才能取得了。先来看一开始解决的想法是,先建立子对象的属性对象,然后再传递给父对象。这个方法很快就失败,光是编译就不过了….。对象的建立是先跑建构子、然后生出对象。在建构子的阶段,就要使用对象的属性,一定是失败的。

 

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
namespace Test002
{
    public class ParentClass
    {
        // Constructors
        public ParentClass(IEnumerable<string> dataCollection)
        {
            this.DataCollection = dataCollection;
        }
 
 
        // Properties
        public IEnumerable<string> DataCollection { get; private set; }
    }
 
    public class ChildClass : ParentClass
    {
        // Fields
        private readonly List<string> _dataCollection = new List<string>();
 
 
        // Constructors
        private ChildClass() : base(_dataCollection) { }
    }
}

 

想了一下,换个角度去解决这个问题。干脆另外再开一个子对象的建构子,先建立要传给父对象的对象,然后不直接传给父对象的建构子,而是传给子对象自己的建构子,然后这个建构子在传递给父对象。写到我眼睛都花了,好像绕口令….。直接看程序代码吧,其实还蛮简单就可以完成这个小小的设计:

 

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
namespace Test003
{
    public class ParentClass
    {
        // Constructors
        public ParentClass(IEnumerable<string> dataCollection)
        {
            this.DataCollection = dataCollection;
        }
 
 
        // Properties
        public IEnumerable<string> DataCollection { get; private set; }
    }
 
    public class ChildClass : ParentClass
    {
        // Fields
        private readonly List<string> _dataCollection = null;
 
 
        // Constructors
        public ChildClass() : this(new List<string>()) { }
 
        private ChildClass(List<string> dataCollection)
            : base(dataCollection)
        {
            _dataCollection = dataCollection;
        }
    }
}
posted @   Clark159  阅读(1210)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示