從父

2017-05-09 15 views
2

繼承兒童專用的方法,我不知道這是有可能,但我在Java編程思想的東西:從父

如果我有一個抽象父類,我可以這樣做:

public ParentClass add(ParentClass a, ParentClass b); 

如果ParentClass然後有一個孩子,我想覆蓋此方法,子類仍然有一個ParentClass add(ParentClass, ParentClass)方法。

有沒有辦法使父函數派生自己的每個孩子?
我不知道如果我的措辭是正確的,但這樣的事情:

// ParentClass.java 
public ParentClass add(ParentClass a, ParentClass b); 

// Foo.java 
@Override // or an equivalent 
public Foo add(Foo a, Foo b) {} 

// Bar.java 
@Override 
public Bar add(Bar a, Bar b) {} 

注意每個孩子怎麼不ParentClass add(...)功能,而是爲每個自己的類型代替?

顯然我可以自己做這些,但我想能夠在父母中創建可覆蓋的。我從來沒有在練習中見過這個,所以我懷疑它的存在。我只想澄清一個人比我更高的Java知識。謝謝。

從理論上講,我想沒有語言已經做過,像這樣:

public child add(child a, child b); 
// where *child* is the type of the child inheriting the method 
+2

您是否已經考慮過使用泛型? –

+0

爲什麼沒有仿製藥?他們是解決這個問題的方法。 –

+0

@OliverCharlesworth對不起,我從來沒有見過像SkinnyJ那樣使用過的泛型。這是**完美**。 – finnrayment

回答

4

在方法的參數Java的協方差不允許。
這種繼承的方法:public ParentClass add(ParentClass a, ParentClass b); 對於所有的孩子都是合法的,因爲它可以指定ParentClass的任何子類作爲參數。
它更靈活。
現在,如果您不想要這種靈活性,並且想要在繼承的方法中強制參數的特定類型,則應該使用泛型抽象類。

public abstract class ParentClass <T extends ParentClass <?>>{ 
    public abstract ParentClass<?> add(T a, T b); 
} 

而在子類中,你可以寫:

public class ChildClass extends ParentClass <ChildClass>{ 
    public ParentClass<?> add(ChildClass a, ChildClass b){ 
     .... 
    } 
} 
+0

可愛!就一件事;有什麼辦法可以自動將泛型類型設置爲孩子的班級,而不必包含它?即完全刪除''? – finnrayment

+0

不,你不能。Java語言不能以這種方式工作。你必須明確指定它。 – davidxxx

+0

好吧,謝謝,我會活下去的。 :P – finnrayment

2

像這樣的事情可能與仿製藥的工作:

public abstract class ParentClass<T extends ParentClass> { 
    public abstract T add(T a, T b); 
} 

class Foo extends ParentClass<Foo> { 
    @Override 
    public Foo add(Foo a, Foo b) { 
     return null; 
    } 
} 

class Bar extends ParentClass<Bar> { 
    @Override 
    public Bar add(Bar a, Bar b) { 
     return null; 
    } 
} 
+0

Thankyou!這正是我正在尋找的。從來沒有見過像這樣的泛型,但它的完美。 – finnrayment

0

您可以定義類型parameter.Refer一個接口https://docs.oracle.com/javase/tutorial/java/generics/types.html的細節

public interface Adder<T> { 
    T add(T a, T b); 
} 

然後實現接口。

public class Foo implements Adder<Foo> { 

    @Override 
    public Foo add(Foo a, Foo b) { 
     // implement the details 
    } 

} 
+3

添加超出已提交的兩個答案的答案是什麼? –