Java 使用不同的作用域访问子类和父类中的相同变量
我经常遇到这种情况,找不到合适的方法。假设类A是父类,类B是子类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
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();
}
}