为了账号安全,请及时绑定邮箱和手机立即绑定

使用变量类实例化抽象类

使用变量类实例化抽象类

当年话下 2022-07-27 21:52:16
由于显而易见的原因,我们不能像这样直接实例化一个抽象类:AbstractObj obj = new AbstractObj(); 其中 AbstractObj 是以下形式的一个类:public abstract class AbstractObj {//... Body omitted }但是,如果我们有扩展类,例如:public class ConcreteObj extends AbstractObj {//... Body omitted}public class AnotherObj extends AbstractObj {//... Body omitted}是否可以通过以下方式实例化对象?这将根据传入的变量的类确定必须使用哪个构造函数。现在假设 o1 和 o2 保证为相同类型。protected AbstractObj computeDiff(AbstractObj o1, AbstractObj o2){    AbstractObj delta = ...?}例如,在上面,如果 o1 是 ConcreteObj 类型,有没有办法在运行时识别它是否属于这种类型并使用适当的构造函数?
查看完整描述

3 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

这里 :


protected AbstractObj computeDiff(AbstractObj o1, AbstractObj o2){

   AbstractObj delta = ...?

}

您可以获得o1with的具体类o1.getClass()。然后,如果这个具体类有一个默认构造函数,你可以调用它Class.newInstance():


protected AbstractObj computeDiff(AbstractObj o1, AbstractObj o2) throws IllegalAccessException, InstantiationException{

   AbstractObj delta = o1.getClass().newInstance();

}


查看完整回答
反对 回复 2022-07-27
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

您可以使用 instanceof 语句。您可以将 o1 转换为 ConcreteObj 并使用此类的方法或字段。


if(o1 instanceof ConcreteObj){

  //((ConcreteObj)o1).someMethod();

}


查看完整回答
反对 回复 2022-07-27
?
慕神8447489

TA贡献1780条经验 获得超1个赞

这绝对是代码气味。不要使用 instanceof。不要使用反射。

绝对不要继续走这条路。

您的所有AbstractObj实例都实现了一组通用操作。由于您computeDiff对 AbstractObjs 进行操作,因此它不能依赖于它接收的不同实现的任何特殊功能。

因此,方法接收或返回什么类型的对象并不重要,只要它们都遵守 AbstractObj 定义。如果需要,您可以返回一个扩展 AbstractObj 的匿名类或任何其他子类。您甚至可以为此目的创建一个特定的子类。但是无论你返回什么,它都不能返回比 AbstractObj 更多的东西。

将参数和返回值声明为AbstractObj与调用您方法的人签署的合同。不要破坏你的合同。


查看完整回答
反对 回复 2022-07-27
  • 3 回答
  • 0 关注
  • 118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信