java - 动态调用——带有接口(interface)和抽象类的java

标签 java dynamic polymorphism

我有这个

public interface ICool {
   public boolean isCool();
}

现在我得到了这个层次结构:

public abstract class AbstractCoolness implements ICool{
   private isCool;

    @Override
    public boolean isCool() {
       return this.isCool;
    }
}

public abstract class CoolPeople extends AbstractCoolness {
   protected boolean isCool= true;
}

public abstract class UnCoolPeople extends AbstractCoolness {
   protected boolean isCool= false;
}    

现在我有很多继承自 UnCoolPeopleCoolPeople 的类。

当我用这个函数调用它们时:

if (person instanceof ICool ) {     
     if (person.isCool()) {
         // do something
     }
}

问题是,每当调用此 person.isCool() 时,它都会调用 abstractCoolness 类并返回 this.isCool,这总是错误的.

知道为什么当我对从 CoolPeople 扩展的人使用此函数时我仍然得到 isCool() == false 吗?

最佳答案

非常简单。此代码将返回 isCool 的值:

public abstract class AbstractCoolness implements ICool{
   private isCool;

    @Override
    public boolean isCool() {
       return this.isCool;
    }
}

而这段代码将简单地在子类中设置一个名为 isCool 的新变量,并隐藏在 AbstractCoolness 中找到的基成员。

public abstract class CoolPeople extends AbstractCoolness {
   protected boolean isCool= true;
}

isCool() 方法将始终返回AbstractCoolness 中定义的isCool 变量,其他不会影响它。自 default value of a booleanfalse,它永远不会返回 true

您可以通过在基类中创建一个采用 boolean 值 isCool 的构造函数并通过子类的构造函数传递它来绕过此问题。

解决方案的快速草图:

abstract class AbstractCoolness {
  private isCool;

  public AbstractCoolness(bool iscool){
     isCool = iscool;
  } 

  public boolean isCool() {
      return this.isCool;
  }
}

class CoolPerson extends AbstractCoolness {
   public CoolPerson() {
     super(true);
   }
}

关于java - 动态调用——带有接口(interface)和抽象类的java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20638561/

相关文章:

java - Eclipse 在线 javadoc 到哪里去了?

c# - 使用动态对象时出现 RuntimeBinderException

arrays - 我可以动态引用数组来执行数学函数吗?

java - 如何用多态替换switch?

java - 简单的 JFileChooser FileFilter 不起作用

java - 自定义 TextView 字体不适用于设置来自 java android 的文本

java - ParseObject 不会在我的数据库表中创建行

Python - 动态调用具有动态数量参数的方法。反射?

c++ - 将子类指针存储在父类指针的映射中

laravel - 如何在morphTo关系laravel中使用whereHas?