2013-11-21 6 views
-2

У меня возникла проблема с вызовом метода класса на втором уровне наследования из суперкласса. Сценарий этогоВызов метода под-подкласса

abstract class SuperClass 
{ 
    public void MethodOne() 
    { 
     MethodTwo(); 
    } 

    public abstract void MethodTwo(); 
} 

class Sub1 extends SuperClass 
{ 
    public void MethodTwo() 
    { 
     //code in sub1 
    } 
} 


class Sub2 extends SuperClass 
{ 
    public void MethodTwo() 
    { 
     //code in sub2 
    } 
} 

С ниже код я ожидаю MethodTwo() от SUB2 называться. Но метод от Sub1 получает вызов. Я что-то упускаю?

SuperClass anObj = new Sub2(); 
anObj.MethodOne(); 
+3

Что такое init()? –

+1

Если 'init()' вы имеете в виду 'MethodOne()', то должен был вызываться 'Sub2 # MethodTwo()'. Как вы (ошибочно) заметили, что был вызван метод из 'Sub1'? – sp00m

+0

, который должен быть MethodOne(). Спасибо ... – Kannan

ответ

1

Во-первых, вам не хватает фактической реализации метода2. Вы не сможете назвать абстрактный метод.

Вам необходимо переопределить абстракцию в подклассе.

class Sub1 extends SuperClass 
{ 
    @override 
    public void MethodTwo() 
    { 
     //code in sub1 
    } 
} 


class Sub2 extends SuperClass 
{ 
    @override 
    public void MethodTwo() 
    { 
     //code in sub2 
    } 
} 

Это может решить вашу проблему.

+2

Хорошая точка, но это должен быть комментарий, а не ответ;) – sp00m

+0

Теперь аннотация не имеет значения ... – Kannan

+0

Важно то, что его методы не объявлены «абстрактными». – ljgw

2

Я объединил все ваши классы в качестве внутренних классов, чтобы помочь им протестировать их. Вы можете удалить «статическое» ключевое слово из классов, если вы поместите их в разных файлах:

public class Example { 
    abstract static class SuperClass 
    { 
     public void MethodOne() 
     { 
      MethodTwo(); 
     } 

     public abstract void MethodTwo(); 
    } 

    static class Sub1 extends SuperClass 
    { 
     @Override 
     public void MethodTwo() 
     { 
      System.out.println("Sub1.MethodTwo()"); 
     } 
    } 


    static class Sub2 extends SuperClass 
    { 
     @Override 
     public void MethodTwo() 
     { 
       System.out.println("Sub2.MethodTwo()"); 
     } 
    } 

    public static void main(String[] args) { 
     SuperClass anObj = new Sub2(); 
     anObj.MethodOne(); 
    } 
} 

Когда я запускаю этот класс он выдает Sub2.MethodTwo(), доказывая, что он на самом деле работает, как вы ожидаете.

Я заметил, что код, который вы предоставили, не является надлежащим Java-кодом и не компилируется. Это потому, что вы отметили методы как abstract, а затем предоставили реализацию с фигурными фигурными скобками { ... }.

Я предполагаю, что это пример установки, которая не работает для вас? Если это так, я думаю, что это не соответствует вашему делу должным образом - поскольку он работает так, как можно было бы ожидать!

Смежные вопросы