C#:子类实例如何获取另一基类实例的字段值(输出不符预期)
问题分析与解决方案:让SlackHelper实例获取CloudCollectionHelper的DatabaseID值
嘿,我来帮你拆解下问题所在:你现在的代码里创建了两个完全独立的对象实例——cloudHelper和slackHelper。虽然SlackHelper继承自CloudCollectionHelper,但这两个实例的属性是各自独立的,你给cloudHelper.DatabaseID赋值12345,根本不会影响到slackHelper的DatabaseID(它会保持默认值0),这就是为什么输出是0而不是预期的12345。
下面给你两种可行的解决方案,按需选择:
方案1:直接操作SlackHelper实例(最贴合你的继承设计)
既然SlackHelper继承了CloudCollectionHelper,那它本身就拥有DatabaseID属性,直接给slackHelper的这个属性赋值就行,不需要单独创建一个CloudCollectionHelper实例:
using System; public class Program { public static void Main() { SlackHelper slackHelper = new SlackHelper(); slackHelper.DatabaseID = 12345; // 直接给SlackHelper实例的属性赋值 Console.WriteLine(slackHelper.GetSlackPageTokens()); } class CloudCollectionHelper { public long DatabaseID { get; set; } } class SlackHelper:CloudCollectionHelper { public long GetSlackPageTokens() { return DatabaseID; } } }
方案2:传递CloudCollectionHelper实例(适合需要复用已有实例的场景)
如果你的业务逻辑里确实需要保留CloudCollectionHelper的实例,并且让SlackHelper复用它的数据,可以通过构造函数把cloudHelper传递给SlackHelper:
using System; public class Program { public static void Main() { CloudCollectionHelper cloudHelper = new CloudCollectionHelper(); cloudHelper.DatabaseID = 12345; SlackHelper slackHelper = new SlackHelper(cloudHelper); // 把实例传递给SlackHelper Console.WriteLine(slackHelper.GetSlackPageTokens()); } class CloudCollectionHelper { public long DatabaseID { get; set; } } class SlackHelper { private readonly CloudCollectionHelper _cloudHelper; // 通过构造函数接收CloudCollectionHelper实例 public SlackHelper(CloudCollectionHelper cloudHelper) { _cloudHelper = cloudHelper; } public long GetSlackPageTokens() { return _cloudHelper.DatabaseID; } } }
核心知识点总结
别混淆类继承和对象实例的概念:继承只是让子类拥有父类的成员定义,但每个对象实例的成员都是独立存储的——修改一个实例的属性,不会自动同步到另一个实例上。
内容的提问来源于stack exchange,提问作者Bhavdip
相关产品推荐
相关产品推荐

