2011-09-14 51 views
3

我該如何擴展Java中的函數? (未類擴展)如何在Java中擴展函數而不是整個類?

/*Example: 
* year 1990 Alex Kumar 
* year 1990 Jhon Ya'ay 
* made this: do not touch modify here */ 
public static void OldMade() 
{ 
    Connect("+1800PIZZA");   
    Say("MYID:69"); 
    Request("PIZZACITROEN_BLACK"); 
} 

/*Example: 
* year 2011 Sunil Williams 
* applied which extends 1990 */ 
public static void MadeInIndia extends this.OldMade 
{ 
    //hidden include Connect("+1800PIZZA");   
    //hidden include Say("MYID:69"); 
    //hidden include Request("PIZZACITROEN_BLACK"); 
    Send("CorrectionPandit"); 
} 

private static void main(Strig args[]) 
{ 
    // Try 1 call and get old + new 
    MadeInIndia();   

    //execute Connect("+1800PIZZA");   
    //execute Say("MYID:69"); 
    //execute Request("PIZZACITROEN_BLACK"); 
    //execute Send("CorrectionPandit"); 
} 
+1

號可以擴展類並覆蓋只是想「擴展」的單一方法。 – Thilo

+0

這是什麼意思只覆蓋方法,而不是擴展類? –

回答

5

不能完成。 Java的面向對象;你只能繼承和擴展類和接口。

你不「擴展」靜態方法。在下面的安排,B類的靜態FOO的版本將掩蓋從A.如果B需要調用的靜態方法,它可以明確地這樣做:

public class A { 

    public static void foo() { System.out("foo for A classes"); } 
} 

public class B extends A { 

    public static void foo() { System.out("foo for B classes"); } 
} 
+0

你說它像你可以*擴展*在其他語言的功能。 – Andrey

+0

我只是在談論Java。不要推斷其他語言的事情。我以爲沒有這樣的事情。 – duffymo

+0

澄清「陰影」:靜態方法沒有基於運行時類型的方法調度:'A b = new B(); b.foo()'可能不會做你認爲它的做法(編譯器會警告它)。 – Thilo

1

延長靜態方法(如從你的例子),你只需要調用原來的方法:

public static void MadeInIndia { 
    OldMade(); 
    Send("CorrectionPandit"); 
} 
2

不能擴展的功能。爲什麼不只是寫:

public static void MadeInIndia extends this. 
{ 
    OldMade(); 
    Send("CorrectionPandit"); 
} 
0

只因爲繼承定義這種方式,所以你不能重寫方法。 超類的概念是把普通行爲放在超級類型。 而你的子類是那個超類的相同類型。 如果你在子類中需要一些特定的行爲,那麼重寫超類方法並根據子類的需求進行更改。

0

如果您考慮inheritance - 其主要目的是允許child類添加parent類的屬性和行爲。除了添加或擴展child類之外,還可能選擇覆蓋。由於重寫對屬性沒有多大意義,因此主要用於方法。還要注意,當你重寫方法時,你幾乎要重寫整個邏輯,或者調用super.method()然後再做一些事情。

現在,如果您想要嘗試並將相同的概念應用於方法 - 您會發現在面嚮對象語言的情況下它確實沒有什麼意義。方法總是僅封裝行爲。屬性不與方法關聯。因此,通過擴展,您只會重寫整個邏輯,或者沿着super.method()的方向行事。

但是,如果像Haskell,Scala或Javascript那樣使用功能性編程語言,所有這些都是有意義的。這是因爲這些語言認爲functions是第一類成員 - 也就是說,您可以僅使用函數編寫程序,而不使用任何類。在這樣的語言中,你會發現函數繼承可以以某種形式或其他形式提供。

0

你無法擴展一個方法;這是違反OOP的概念。

您可以通過以下兩種方式實現的功能 -

public static void OldMade() 
{ 
    Connect("+1800PIZZA");   
    Say("MYID:69"); 
    Request("PIZZACITROEN_BLACK"); 
} 

public static void MadeInIndia extends this.OldMade 
{ 
    OldMade(); 
    Send("CorrectionPandit"); 
} 

private static void main(Strig args[]) 
{ 
    MadeInIndia(); 
} 

或者

public static void OldMade() 
{ 
    Connect("+1800PIZZA");   
    Say("MYID:69"); 
    Request("PIZZACITROEN_BLACK"); 
} 

/*public static void MadeInIndia extends this.OldMade 
{ 
    OldMade(); 
    Send("CorrectionPandit"); 
}*/ 

private static void main(Strig args[]) 
{ 
    //MadeInIndia(); 
    OldMade(); 
    Send("CorrectionPandit"); 
} 
相關問題