java如何使用instanceof根据子类类型对子类执行不同的操作?
我有一个抽象类A和两个子类B和C
在另一个类中,我有一个a的ie:list实例列表。当然,A的列表可以包含可以是B或C的实例的元素
如果实例是B,我想将其添加到驻留在类D中的表A中。 如果实例是C,我想将其添加到表B中,表B也驻留在类D中
如果不使用instanceof,这是可能的吗
你可以在下面搜索框中键入要查询的问题!
我有一个抽象类A和两个子类B和C
在另一个类中,我有一个a的ie:list实例列表。当然,A的列表可以包含可以是B或C的实例的元素
如果实例是B,我想将其添加到驻留在类D中的表A中。 如果实例是C,我想将其添加到表B中,表B也驻留在类D中
如果不使用instanceof,这是可能的吗
# 1 楼答案
这里可能有一个解决方案:
一个简单的D类:
然后:
# 2 楼答案
一种可能的方法是让B和C返回一些鉴别器,让将列表中的内容移动到D的表中的类知道应该将它们添加到哪个表中,但最终会达到需要切换或类似操作的程度
例如:
有了这个解决方案,您可以添加A的更多子类,这些子类与B或C共享相同类型的“鉴别器”,因此您的分类器类将把它们的实例放在相同的表中
除此之外,你在分类器的逻辑中保留了实际的决定,如果类型_1和类型_2有一些语义含义,那么B和C实际上不需要知道它们为什么要公开它
# 3 楼答案
您有一个列表
L : List<A>
,其中包含B extends A
和C extends A
。当您从L
获取元素E
时,您喜欢将E
添加到D.A
ifE instanceof B
或将E
添加到D.B
ifE instanceof C
通过提供一个抽象方法
A.visit(D)
,使用Visitor PatternB.visit(D)
将通过调用D.addMeToTableA(this)
来实现它,而C.visit(D)
将通过调用D.addMeToTableB(this)
来实现它# 4 楼答案
是的,在a中放置一个方法,在包含表名的B和C中重写该方法
# 5 楼答案
“如何根据子类类型对子类做不同的事情”,或者换句话说:多态性。当然是可能的,这是OO软件的主要原则之一。您不需要使用instanceOf。getClass或其他形式的元编程,用于解决基本的OO问题
您可以使用类似的抽象方法:
在A中,你以一种方式实现;在B中,你以另一种方式实现
当然,这可能是个坏名字,当然,返回字符串可能是个坏主意,这只是基于a、B、C问题的一个例子。软件开发是关于命名和语义的,下次如果你真的想得到好的建议,而不是一本基本的OO书籍中的一般建议,请使用有意义的名称