簡體   English   中英

Java中的依賴注入和繼承

[英]Dependency injection and Inheritance in Java

我有以下代碼:

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。 我該如何實現,當執行到達Parent的run()時,將執行RunMe的greet(或可能在另一個地方),而不是GrandParent的greet()。

還是首先有可能?

我不知道如果要讓一個未擴展的Parent對象在不更改Parent或Grandparent代碼的情況下調用不同的greet方法,怎么辦?

您可以在RunMe中編寫一個實例(非靜態)內部類,該內部類擴展了Parent並覆蓋了Parent實例的run(),從而可以調用RunMe實例的run()。 您的main()方法將創建新子類的實例,而不是Parent的實例。

首先,您需要一個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();
}

我不知道這是不是你要的。

嘗試這個:

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();
    }
}

我認為您的意思是:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM