Внедрение зависимостей и наследование в Java - PullRequest
0 голосов
/ 08 ноября 2011

У меня есть следующий код:

public class GrandParent {    
    public void greet() {
        System.out.println("Hello from grandpa.");
    }    
}

public class Parent extends GrandParent {    
    public void run() {
        greet();
    }                   
}

public class RunMe {       
    public static void main(String args[]) {
        Parent p = new Parent();
        p.run();
    }

    public void greet() {
        System.out.println("Hi.");
    }    
}

Мне поручено написать класс RunMe и, насколько это возможно, мне не разрешено изменять классы Parent и GrandParent.Как я могу реализовать это таким образом, чтобы, когда выполнение достигает run () Parent, выполняется greet () RunMe (или может быть в другом месте), а не greet () GrandParent.

Или это вообще возможно?

Ответы [ 5 ]

0 голосов
/ 08 ноября 2011

Я думаю, вы имели в виду это:

public class RunMe extends Parent {
    public static void main(String args[]) {
        Parent p = new RunMe();
        p.run();
    }

    public void greet() {
        System.out.println("Hi.");
    }
}   
0 голосов
/ 08 ноября 2011

попробуйте это:

public class MyParent extends Parent {    
    @Override
    public void greet() {
        System.out.println("hello from MyParent");
    }                   
}

public class RunMe {       
    public static void main(String args[]) {
        Parent p = new MyParent();
        p.run();
    }
}
0 голосов
/ 08 ноября 2011

Вы можете написать экземпляр (не статический) внутреннего класса в RunMe, который расширяет Parent и переопределяет run () экземпляра Parent, так что он выполняет вызов run () экземпляра RunMe.Ваш метод main () создаст экземпляр нового подкласса вместо Parent.

0 голосов
/ 08 ноября 2011

Во-первых, вам нужен экземпляр RunMe, чтобы вызвать его run() метод, поскольку это не статический метод.Один из способов понять, что происходит в Parent, - это создать подкласс Parent:

public static void main(String args[]) {
    final RunMe runMe = new RunMe();
    Parent p = new Parent() {
        public void run() {
            super.run(); // runs Parent.run()
            runMe.run(); // runs the hook function
        }
    };
    p.run();
}

. Я понятия не имею, что вы ищете.

0 голосов
/ 08 ноября 2011

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

...