Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何访问已分配子对象的属性?

如何访问已分配子对象的属性?
EN

Stack Overflow用户
提问于 2022-07-22 10:33:25
回答 1查看 38关注 0票数 0

有4类A, B, A1, and B1

A1A

B1B的子类;

A有一个属性B

如何正确访问B1类中的A1属性?

下面的问题是演示,也是两个可能的解决方案。

解决方案N1存在一个问题,即同一个对象存储在两个属性中。

解决方案N2有一个问题,您必须在每次需要该属性时都对其进行转换;

有什么更好的方法吗?

最小代码示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class A 
{
    public A(B foo)
    {
        this.foo = foo;
    }

    public B foo { get; set; }
}

public class B {}

public class A1 : A
{
    // way N1 to do it.
    public B1 b1_foo { get; set; }
    
    public A1(B1 foo) : base(foo)
    {
        // way N1 to work
        this.b1_foo = foo;
    }
    
    public void SomeMethod() 
    {
        // access way by N1
        var val = b1_foo.SomeProperty;
        // N2 way to access B1's SomePropery
        val = ((B1)this.foo).SomeProperty;
    }
}

public class B1 : B 
{
    public int SomeProperty {get;set;}
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-22 13:34:16

这就是我们可能使用泛型的地方。这可能会帮助你(我希望),或者它可能打开一个全新的世界的混乱。

看起来,A1存在的唯一原因是它可以使用B1而不是B

为了使它具有可读性,我使类名稍微长了一点,所以我从以下几个方面开始:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ThingA
{
    public ThingA(ThingB foo)
    {
        this.Foo = foo;
    }

    public ThingB Foo { get; set; }
}

public class ThingB { }

public class ThingBWithExtraProperty : ThingB
{
    public int SomeProperty { get; set; }
}

您可以创建这样一个类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class GenericThingA<T> where T : ThingB
{
    public GenericThingA(T foo)
    {
        this.Foo = foo;
    }

    public T Foo { get; set; }
}

泛型参数-- <T> --意味着当创建类的实例时,必须指定T是什么。约束where T : ThingB意味着无论T是什么,它要么是ThingB,要么继承它。

因此,假设您有一个ThingBWithExtraProperty实例。你能做到的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var thingB = new ThingBWithExtraProperty();
var genericThingA = new GenericThingA<ThingBWithExtraProperty>(thingB);

现在,对于这个类实例,Foo的类型是ThingBWithExtraProperty。因此,如果您想访问该属性,可以调用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var propertyValue = genericThingA.Foo.SomeProperty;

你几乎可以肯定已经对此熟悉了。这就像创建一个List<DateTime>一样。泛型类型是List<T>T可以是任何东西,但是当我们创建一个List<DateTime>时,这意味着列表中的所有对象都是DateTime

这是更多关于泛型的文档

这是一个我自己的博客。第二个原因是,一旦我们了解了泛型,有时我们会尝试用它们解决一些没有意义的问题,结果变得非常复杂。我学到了艰难的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73084694

复制
相关文章
为什么我们的机器学习平台支持Python,而不是R
有很多文章比较了Python和R在数据科学方面的相对优点。但是这并不在这篇文章的讨论范围。这篇文章是关于数据分析师和机器学习工程师的分歧,以及他们对编程语言的不同需求。
HuangWeiAI
2020/03/18
6840
为什么我们的机器学习平台支持Python,而不是R
为什么我们选择使用 React 而不是 Angular 构建新 UI
我们在2013年推出了Cloud Elements集成平台的v1版本,这个产品在过去几年里一直为客户和公司发展提供了良好的服务。但是2017年,Web技术迅速演变,从而使用户期望也进一步发展。现在是我们重新思考整个开发者流程的时候了,这也为我们重新思考我们的技术栈提供了一个机会。 在产品发布周期和发布期限的世界中,技术的选择至关重要。以下是我们一路走来的历程,帮助你揭开一些关于React的实用亮点。
疯狂的技术宅
2019/03/28
2.3K0
为什么我们选择使用 React 而不是 Angular 构建新 UI
为什么我们选择使用 React 而不是 Angular 构建新 UI
我们在2013年推出了Cloud Elements集成平台的v1版本,这个产品在过去几年里一直为客户和公司发展提供了良好的服务。但是2017年,Web技术迅速演变,从而使用户期望也进一步发展。现在是我们重新思考整个开发者流程的时候了,这也为我们重新思考我们的技术栈提供了一个机会。 在产品发布周期和发布期限的世界中,技术的选择至关重要。以下是我们一路走来的历程,帮助你揭开一些关于React的实用亮点。 我们来自哪里 在React之前,我们使用AngularJS,这可能是当时被选中的最流行的前端框架。 但是如
顶级程序员
2018/05/03
2.7K0
为什么我们选择使用 React 而不是 Angular 构建新 UI
html 转换为cshtml,使用Html而不是csHtml
我想使用纯HTML页面而不是使用MVC .net的cshtml . 但是当我通过右键单击索引添加视图时,我只能看到两个选项 .
全栈程序员站长
2022/09/10
2.5K0
Spot CEO:我们为什么选择Babylon.js而不是Three.js
为现代网络开发令人兴奋的事情之一是底层平台的快速发展。 WebAssembly、WebGL、WebGPU、Web Worker 等正在解锁以前典型 Web 产品无法想象的体验。 在过去的几年里,我们看到像 Figma 这样的产品利用这一点创造了极具吸引力的业务和产品。
用户1758543
2023/05/08
2.2K0
Spot CEO:我们为什么选择Babylon.js而不是Three.js
开始使用HTML
HTML指的是超文本标记语言(HyperText Markup Language),是用来描述网页的一种语言。 HTML使用标签来描述网页。 本文目录 1 编辑器与浏览器 2 床前明月光 3 标题与段落 4 注释 5 链接 6 文本格式化 7 列表 8 表格 9 图像,音频,视频 10 区块 11 表单 12 相关
mwangblog
2018/07/04
4420
innodb为什么选择B+ Tree而不是跳表,Redis为什么选择跳表而不是B+ Tree
链表和数组相比,数组可以通过下标快速定位,或者通过二分查找,查询复杂度为O(logn),而链表只能按照顺序挨个查找,复杂度为O(n)。
大忽悠爱学习
2023/03/23
2.4K0
innodb为什么选择B+ Tree而不是跳表,Redis为什么选择跳表而不是B+ Tree
【开学季】调查报告:我们为什么要做学霸而不是学渣?
本文作者:马不停蹄 编者按:“学霸”,并不是那个把定理背的滚瓜烂熟的人,而是能活学活用、有独立思考能力的人。“学渣”,也不是课堂上不够优秀的人,而是任何事情都做不好的人。在我们曲解“学霸”和“学渣”的概念、并放大小概率事件的时候,我们不过是在为自己的慵懒,找一个连“冠冕堂皇”都算不上的貌似合理的借口。 学霸和学渣的各种故事,是最近两年微博上各类段子手们拿来创作的一个重要题材,大部分都以嘲讽学霸为主,有几个比较流行的:比如什么上学时一定要善待身边的差生,因为将来你大学毕业去工地搬砖时会发现他们是你的
小莹莹
2018/04/20
6500
【开学季】调查报告:我们为什么要做学霸而不是学渣?
为什么建议你用nullptr而不是NULL?
在C语言中,我们常常用NULL作为指针变量的初始值,而在C++中,却不建议你这么做。
编程珠玑
2019/08/28
9.6K0
为什么建议使用你 LocalDateTime ,而不是 Date?
多线程并发如何保证线程安全 - 避免线程之间共享一个SimpleDateFormat对象,每个线程使用时都创建一次SimpleDateFormat对象 => 创建和销毁对象的开销大 - 对使用format和parse方法的地方进行加锁 => 线程阻塞性能差 - 使用ThreadLocal保证每个线程最多只创建一次SimpleDateFormat对象 => 较好的方法
芋道源码
2019/10/23
1.6K0
为什么特征工程要用 SQL 而不是 Python
我们常说机器学习是一门实验科学。所以相比较传统工程而言,机器学习分成两个大的阶段:
用户2936994
2022/05/18
8230
为什么特征工程要用 SQL 而不是 Python
JDBC为什么要使用PreparedStatement而不是Statement
前言 这篇博客不是我写的,是由刘志军大大翻译的,真心觉得很棒,而且是必学要掌握的东西,所以就转载过来了,我个人的第一篇转载文章。 开始 PreparedStatement是用来执行SQL查询语句的API之一,Java提供了 Statement、PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程。同时Prepar
roobtyan
2018/06/04
1.4K0
JDBC为什么要使用PreparedStatement而不是Statement
PreparedStatement是java.sql包下面的一个接口,用来执行SQL语句查询,通过调用connection.preparedStatement(sql)方法可以获得PreparedStatment对象。数据库系统会对sql语句进行预编译处理(如果JDBC驱动支持的话),预处理语句将被预先编译好,这条预编译的sql查询语句能在将来的查询中重用,这样一来,它比Statement对象生成的查询速度更快。下面是一个例子:
哲洛不闹
2018/09/19
9440
JDBC为什么要使用PreparedStatement而不是Statement
为什么我会选择 React 而不是 Vue?
你注意到我过于圆滑的标题了吗?我将依据我所喜欢的方式去构建这个对话,而不是我客观上认为的唇枪舌战。我想后者并不会起作用。
疯狂的技术宅
2019/03/27
1.4K0
为什么建议使用你 LocalDateTime ,而不是 Date?
来源:juejin.im/post/5d7787625188252388753eae
JAVA葵花宝典
2019/10/29
1.1K0
为什么建议你使用LocalDateTime而不是Date?
calendar是共享变量,并且这个共享变量没有做线程安全控制。当多个线程同时使用相同的SimpleDateFormat对象【如用static修饰的SimpleDateFormat】调用format方法时,多个线程会同时调用calendar.setTime方法,可能一个线程刚设置好time值另外的一个线程马上把设置的time值给修改了导致返回的格式化时间可能是错误的。在多并发情况下使用SimpleDateFormat需格外注意SimpleDateFormat除了format是线程不安全以外,parse方法也是线程不安全的。parse方法实际调用alb.establish(calendar).getTime()方法来解析,alb.establish(calendar)方法里主要完成了
Bug开发工程师
2020/03/12
2.1K0
为什么建议使用你 LocalDateTime ,而不是 Date?
来源:juejin.im/post/5d7787625188252388753eae
用户1516716
2019/10/24
1.1K0
为什么是int main()而不是void main()
这是基于我们学校老师一直使用void main(),而发的感慨,大一学习C语言时,我就在想,老师上课演示的为什么一直用void main(),而不是int main()呢?不为了偷懒?还是习惯性的语句呢?在查阅了部分大牛的博客,翻阅了C Primer Plus和C++ Primer Plus这两本圣经级别的书本之后,得出以下结论(有一部分是别人的结论,属于半转载),可能不太严谨,请多多包涵。
对弈
2019/09/04
3.7K0
JDBC为什么要使用PreparedStatement而不是Statement
PreparedStatement是java.sql包下面的一个接口,用来执行SQL语句查询,通过调用connection.preparedStatement(sql)方法可以获得PreparedStatment对象。数据库系统会对sql语句进行预编译处理(如果JDBC驱动支持的话),预处理语句将被预先编译好,这条预编译的sql查询语句能在将来的查询中重用,这样一来,它比Statement对象生成的查询速度更快。下面是一个例子:
哲洛不闹
2018/09/19
1K0
JDBC为什么要使用PreparedStatement而不是Statement
为什么建议使用你LocalDateTime,而不是Date?
在项目开发过程中经常遇到时间处理,但是你真的用对了吗,理解阿里巴巴开发手册中禁用static修饰SimpleDateFormat吗?
良月柒
2019/10/28
1.4K0
为什么建议使用你LocalDateTime,而不是Date?

相似问题

如何从POST接收JSON?

129

如何使用POST方法从android接收json对象

13

节点从axios post接收post json

11

从POST请求接收JSON响应

11

从接收的POST阵列解码JSON

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文