2013-09-26 3 views
0

Предположим, у меня есть два класса A и B, где A - суперкласс из B. Теперь я пишу функцию (переопределить), скажем, функцию() в обоих классах. Тогда, если я хочу назвать функцию() в A из объекта B, возможно ли это?вызов переопределенной функции в суперклассе из подкласса в JAVA

+0

@ Дюкелинг. Я имел в виду, что вы не можете вызвать метод суперкласса вне самого объекта. –

+1

Зачем вам это делать в первую очередь? – Achrome

+0

@AshwinMukhija Я просто хотел узнать о реализации, можно ли это сделать или нет. –

ответ

0

данных классов, как

class A { 
    public void funct() {...} 
} 

class B extends A { 
    @Override 
    public void funct() {...} 
} 

Вы спрашиваете

Тогда, если я хочу назвать функцию() в A из объекта B, возможно ли это ?

Итак, давайте

B b = new B(); 
b.funct(); 
A a = b; 
a.funct(); 
((A)b).funct(); 

превыше всего делать то же самое из-за полиморфизма и позднего связывания.

Единственный способ назвать реализацию суперкласса - получить ссылку на этот элемент с помощью ключевого слова super.

class A { 
    public void funct() {...} 
} 

class B extends A { 
    @Override 
    public void funct() { 
     super.funct(); 
    } 
} 
+0

Итак, мы не можем напрямую ссылаться на перегруженную функцию, просто используя объект, правильно? Спасибо за помощь! –

+0

@DChetan Правильно. Пожалуйста. –

2
class A { 
    public void f() {...} 
} 

class B extends A { 
    @Override public void f() { super.f(); } 
} 

Это то, что вы хотите?

Если вместо этого вы хотите позвонить A#f() непосредственно на экземпляре типа B, вы должны предоставить функцию заполнитель для этого:

class B extends A { 
    @Override public void f() { ... } 
    public void superF() { super.f(); } 
} 

new B().f(); // calls B#f(); 
new B().superF(); // calls A#f(); 
1

меня трик, такие, как эта ситуация для ее эксплуатации в нелогичном способе с использованием флагом аргумента в функц() метод: D, как это:

class A { 

    public void funct(boolean callSuper) { 
     // avoid using callSuper arg here 
    } 
} 

class B extends A { 

    @Override 
    public void funct(boolean callSuper) { 
     if (callSuper) { 
      super.funct(callSuper); 
      return;//if return type is void 
     } else { 
      //do here the functionality if the flag is false 
     } 
    } 
} 

или

class A { 

    public void funct() { 

    } 
} 

class B extends A { 

    private boolean callSuper = false; 

    @Override 
    public void funct() { 
     if (callSuper) { 
      super.funct(); // call A.funct() functionality 
      setCallSuper(false); 
     } else { 
      //do here the functionality of B.funct() if the flag is false 
     } 
    } 

    public void setCallSuper(boolean callSuper){ 
     this.callSuper = callSuper; 
    } 
} 
Смежные вопросы