Java 使用不同的作用域访问子类和父类中的相同变量

Java 使用不同的作用域访问子类和父类中的相同变量,java,Java,我经常遇到这种情况,找不到合适的方法。假设类A是父类,类B是子类 class A { protected Animal anim; public A(){ } } class B extends A{ public B(){ anim = new Dog(); } private doSomething(){ ((Dog)anim).accessDogMethod(); } } 我的问题总是与变量anim

我经常遇到这种情况,找不到合适的方法。假设类A是父类,类B是子类

class A {
    protected Animal anim;
    public A(){
    }

}

class B extends A{
    public B(){
       anim = new Dog();
    }

    private doSomething(){
       ((Dog)anim).accessDogMethod();
    }
}
我的问题总是与变量anim有关。我想访问特定的狗方法。然而,我不能这样做,除非我沮丧。我不想把它弄得到处都是。所以我找到的唯一方法是:

class B extends A{
    private Dog dog;
    public B(){
       anim = new Dog();
       dog = anim; 
    }

    private doSomething(){
       dog.accessDogMethod();
    }
}
然而,必须有更好的方法。我想在父类和子类中都使用变量,这样每个类都可以访问它们的相关信息


有什么建议吗?

您可以使用参数化类型(即泛型)

A类{
受保护的动物;
公共A(){
}
}
B类扩展了A类{
公共图书馆B(){
动漫=新狗();
}
私人剂量计(){
anim.accessDogMethod();
}
}

听起来好像您有并行继承层次结构。这是一种常见的代码气味,表明您可能需要重新考虑您的设计。

因此您有两个并行类层次结构:B->a和Dog->Animal。也许你可以通过修改设计来避免这种情况。我认为你应该在Animal上声明超级方法,然后在sub类上实现。这个建议的解决方案是否允许我访问只对Dog对象可用的方法accessDogMethod?。是的,我有一个并行继承层次结构。这是坏消息还是不高兴?是的,会的。当你有平行的层次结构时,这意味着当某些东西必须改变时,你必须在两个不同的地方进行改变。这也意味着你在做程序的时候必须记住两件事,而不是一件,通常一个人在任何特定的时间都可以记住7件事,所以你更容易犯错误。但有时这些等级制度是一种必要的邪恶,而其他的选择会更糟。啊,好的,谢谢你的解释和建议的答案。
class A<T extends Animal> {
    protected T anim;
    public A(){
    }
}

class B extends A<Dog> {
    public B(){
       anim = new Dog();
    }

    private doSomething(){
       anim.accessDogMethod();
    }
}