2014-01-09 2 views
0

Иерархия Наследования подобна этому.Как вызвать метод в суперклассе суперкласса подкласса

A --> B --> C 

и Пример кода является, как показано ниже

Class A{ 
    public void method(){....} 
} 
Class B extends A{ 
    public void method(){.....} 
} 
Class C extends B{ 
    public void method(){......} 
} 

Чтобы получить доступ к методу() А из класса С можно писать код, как это, в методе() из C;

public method(){ //To call method() of A, when we call method() in C. 
    Object obj=super.super(); 
    obj.method(); 
} 

Будет ли этот код работать для моего сценария или нет ?. Если это неправильно, предложите мне свои ответы.

+2

Вы попробовали запустить его? –

+0

Заполните '' '' '' '' '' '' '' '' '' '' '' тем кое-чем легко идентифицируемым, как 'println' имени класса. Затем проверьте его, чтобы узнать, что происходит для вас. Если он даже не компилируется, ясно, что ответ на ваш вопрос «нет». Хотя, я бы предположил, что если 'C' должен использовать реализацию' A', он может быть более подходящим как подкласс 'A' напрямую. Если он использует вещи как из «A», так и «B», у вас, вероятно, слишком мало классов и должно нарушить общую функциональность в своей собственной структуре. – jpmc26

+0

super.super(); - Ошибка компиляции – gowtham

ответ

1

Вы не можете сделать это в Java. Прежде всего, super.super() не имеет смысла. (super(); полезен внутри конструктора, но вне конструктора это ничего не значит.) Во-вторых, если у вас есть объект типа C, вы не можете создать объектную переменную, которая является «тем же объектом, но типа A», , и это то, что вы пытаетесь сделать. время выполнения Тип объекта всегда будет C. Поэтому, даже если это законно:

public void method() { 
    A obj = this; 
    obj.method(); 
} 

даже если obj объявлен как тип A, его «реальный» тип во время выполнения всегда будет C, и приведенный выше код будет вызывать method() в C, что зацикливание ,

Вы можете method() в C вызова method() в B, как это:

public void method() { 
    super.method();  // calls the method in B 
} 

Но нет никакого способа, чтобы пропустить это и называют method в A:

public void method() { 
    super.super.method();  // illegal 
} 

И если вы думаете, хочу сделать это, тогда вам, вероятно, нужно переосмыслить свой дизайн. Переопределяющий метод обычно либо вызывает метод родителя, либо добавляет что-то новое в него, либо делает что-то совершенно новое; обычно не имеет большого значения для того, чтобы добавить что-то новое к методу grandparent, но пропустить что-то новое, которое было добавлено в родительский метод. Если после всего этого вы действительно хотите это сделать, вы можете это сделать, добавив новый метод protected в A с другим именем.

0

Нет, method() в A перекроет по method() в B, а затем method() в B перекроет по method() в C, то вы не можете позвонить method() в A от C.

0

Нет, это невозможно сделать в java. Вы получите ошибку компилятора: Ошибка в строке «super.super.method();». В Java класс не может напрямую обращаться к членам бабушки и дедушки. Хотя это разрешено на C++. В C++ мы можем использовать оператор разрешения области (: :) для доступа к любому члену предка в иерархии наследования. В Java мы можем получить доступ к членам бабушки и дедушки только через родительский класс. Как когда-либо и может сделать это в методе() класс В и классе С:

void method(){ 
// method of class B 
super.method(); // calls method() of class A 
} 

    void method(){ 
// method of class C 
super.method(); // calls method() of class B 
} 

Надеется, что это помогает ..

+0

Незначительная техничность: класс не может напрямую обращаться к членам бабушки и дедушки * методы *. Тем не менее, он всегда может попасть в поля участника, если они не являются частными. Если это невозможно сделать с помощью 'super.field', это можно сделать с помощью' ((A) this) .field'. Но это не работает с методами. – ajb

+0

Если вы хотите использовать супер ключевое слово для вызова метода родительского класса, этот код будет работать, иначе вы можете создать объект класса родителя, а затем вы можете вызвать методы родительского класса. – iamyogish

+0

@iamyogish вы внедрили метод без какого-либо типа возврата. Возврат необходим для любых методов/функций в Java. –

0

Я предлагаю вам сделать что-то подобное.

Class A{ 
    public void method(){ 
    // implement your code here. 
    } 
} 
Class B extends A{ 
    public void method(){ 
    super.method(); // will call method of A 
    } 
} 
Class C extends B{ 
    public void method(){ 
    super.method(); // will call method of B 
    } 
} 
+0

Это классный Qadir, но по моему требованию я не должен менять код в классах A и B. Только в классе C я могу делать кодирование. И еще одна вещь: я не должен создавать объект для класса А напрямую. – Azeez

0

Я не уверен, если это намерение дизайнера языка Java, но я понимаю под этим: С только одиночным наследованием, когда C наследует от B, C должен заботиться только о его непосредственном родителе, который B. Если B решил скрыть что-либо от A от своего ребенка, C не должен это видеть.

Есть много способ обойти это, например:

Если предположить, что в дизайне, вы предвидеть такую ​​ситуацию и хотите любого уровня класса ребенка, чтобы иметь возможность использовать ваш method, вы можете создать защищенный один для ребенка использовать:

class A { 
    protected void methodInternal() {...} 
    public void method() { methodInternal(); } 
} 

class B extends A { 
    public void method() { 
     someOtherLogic(); 
    } 
} 

class C extends B { 
    public void method() { 
     methodInternal(); 
     somethingElse(); 
    } 
} 

Если разработчик Б, который решил изменить method «s осущ, но она по-прежнему хотят, чтобы оставить гибкость позволить ребенку использовать-х method, он может сделать что-то вроде:

class A { 
    public void method() { } 
} 

class B extends A { 
    public void method() { 
     someOtherLogic(); 
    } 
    protected void originalMethod() { 
     super.method(); 
    } 
} 

class C extends B { 
    public void method() { 
     originalMethod(); 
     somethingElse(); 
    } 
} 
Смежные вопросы