0

我想在抽象类中实现一个方法,该方法由继承的类调用并使用它们的值。

例如:

abstract class MyClass{
    String value = "myClass";
    void foo(){System.out.println(this.value);}
}

public class childClass{
    String value="childClass";
    void foo(){super.foo();}
}

public static void main(String[] args){
    new childClass.foo();
}

这将输出“myClass”,但我真正想要的是输出“childClass”。这样我就可以在一个类中实现一个“通用”方法,当它被其他类扩展时,它将使用这些类的值。

我可以将值作为函数参数传递,但我想知道是否可以实现我所描述的“架构”。

由继承类调用的超级方法,它使用来自调用者而不是自身的值,而不通过参数传递值。

4

4 回答 4

2

你可以这样做:

abstract class MyClass {

    protected String myValue() {
        return "MyClass";
    }

    final void foo() {
        System.out.println(myValue());
    }
}

public class ChildClass extends MyClass {
    @Override
    protected String myValue() {
        return "ChildClass";
    }
}

等等

于 2012-06-24T19:07:52.423 回答
0

这是组合优于继承的地方

public class Doer{
   private Doee doee;

   public Doer(Doee doee){
       this.doee = doee;
   }
   public void foo(){
       System.out.println(doee.value);
   }
}

public abstract class Doee{
    public String value="myClass"
}

public ChildDoee extends Doee{
    public String= "childClass"
}

...

//Excerpt from factory
new Doer(new ChildDoee);
于 2012-06-24T19:11:21.020 回答
0

我相信你在问这是否可能:

public class MyClass {
  void foo() {
    if (this instanceof childClass) // do stuff for childClass
    else if (this intanceof anotherChildClass) // do stuff for that one
  }
}

所以答案是“是的,这是可行的”,但非常建议不要这样做,因为它 a) 尝试重新实现多态性而不是使用它,并且 b) 违反了抽象类和具体类之间的分离。

于 2012-06-24T19:50:30.200 回答
0

您只是希望valueinMyClass的实例有所不同childClass
为此,请更改 childClass 构造函数中的值:

public class childClass {
    public childClass() {
        value = "childClass";
    }
}

编辑:

如果您无法覆盖/替换构造函数,请添加一个实例块(在构造函数之后执行,甚至是未声明的“默认”构造函数):

public class childClass {
    {
        value = "childClass";
    }
}
于 2012-06-24T19:14:40.493 回答