如何在Java中的多级继承中自动解决歧义?

时间:2016-03-30 04:18:24

标签: java inheritance

Java不支持多重继承。其中一个原因是在继承时方法之间可能存在歧义。例如,在下面的场景中,对于哪个版本的" LevelMethod()"将存在歧义。应该在Class“Level3”中继承

class Level1{
public void LevelMethod(){
    System.out.println("Level1 method");
 }
}
class Level2{
public void LevelMethod(){
    System.out.println("Level2 method");
 }
}
class Level3 extends Level1,Level2{
}

但是,在以下场景中可能会出现同样的歧义,通过多级继承,对于哪个版本的" LevelMethod()"应该继承在 “Level4”等级。

class Level1{
public void LevelMethod(){
    System.out.println("Level1 method");
 }
}

class Level2 extends Level1{
public void LevelMethod(){
    System.out.println("Level2 method");
 }
}

class Level3 extends Level2{
public void LevelMethod(){
    System.out.println("Level3 method");
 }
}

class Level4 extends Level3{

}

java如何解决多级继承中的歧义,但不能在多重继承中解决歧义?

3 个答案:

答案 0 :(得分:2)

当没有解决冲突的机制时,存在歧义。 在单继承上,子项覆盖其父项上的方法,方法查找具有明确的解决方案,没有冲突,因为有订单。

经典多重继承未指定冲突解决机制,因此出现diamond problem

FYI其他模型(如mixins)指定隐式冲突解决的线性化机制,而traits则要求您明确解析冲突的代数。

答案 1 :(得分:0)

继承层次结构中调用的方法取决于对象类型。每个子类都覆盖父级" levelMethod"。

尝试一些例子

var tabs = [{
    "TAB_ID": "1",
    "TAB_NAME": "TAB ONE",
    "TAB_DISPLAY": "1",
    "QUESTIONS": [{
        "QUESTION_ID": 1,
        "QUESTION": "Question number one",
        "ANSWER": ""
    }, {
        "QUESTION_ID": 2,
        "QUESTION": "Question number two",
        "ANSWER": ""
    }, {
        "QUESTION_ID": 3,
        "QUESTION": "Question number six",
        "ANSWER": ""
    }]
}, {
    "TAB_ID": "1",
    "TAB_NAME": "TAB ONE",
    "TAB_DISPLAY": "1",
    "QUESTIONS": [{
        "QUESTION_ID": 1,
        "QUESTION": "Question number one",
        "ANSWER": "Some Other Answer"
    }, {
        "QUESTION_ID": 2,
        "QUESTION": "Question number two",
        "ANSWER": ""
    }, {
        "QUESTION_ID": 3,
        "QUESTION": "Question number six",
        "ANSWER": "Some Still Different Answer"
    }]
}];

tabs.forEach(tab => {
  tab['QUESTIONS'].forEach(question => {
    if (question['ANSWER']) {
      question['HAS_ANSWER'] = 1;
    }
  });
});

console.log(tabs);

依旧......

答案 2 :(得分:0)

java中的对象只是简单的引用。因此,具有is-a关系的两个或多个类是否具有相同的方法并不重要,因为它将取决于哪个对象调用该方法,因为引用将是不同的(由其hashCode标识)。在您的给定代码中,如果Level 2的对象调用方法LevelMethod(),则引用类Level 2的上下文,因此显然Java将解释来自Level 2的LevelMethod()的结果。 但是,由于超类的对象可以引用子类的对象,因此在调用LevelMethod()时,您需要指定哪个类。 如果您想证明引用不同,请执行以下程序:

class A{
    public void cmethod(){
        System.out.println("Class A");
    }
}
class B extends A{
    public void cmethod(){
        System.out.println("Class B");
    }
}
class C extends B{
    public void cmethod(){
        System.out.println("Class C");
    }
}
class MainClass{
    public static void main(String[] args){
        A aObj = new A();
        B bObj = new B();
        C cObj = new C();
        System.out.println(aObj.toString());
        System.out.println(bObj.toString());
        System.out.println(cObj.toString());    
    }
}

说明:如果您创建自己的类并且不重写方法toString(),那么Object类将调用它的默认toString()方法,该方法显示Class@refHashCode(所有类都是类Object)的子类。