2016-01-10 114 views
0

我有一個抽象類A的java:傳遞一個對象,並返回同一個對象的類型

public astract class A{ 
    public abstract A f(A a) throws IllegalArgumentException; 
}; 

但我想反對一個傳遞給F到具有相同類型的對象本身並返回相同類型的對象,否則拋出IllegalArgumentException。我怎樣才能爲所有的子類實現那一次?在A級課程中有一種方法可以做到這一點?

回答

1

Java沒有提供聲明式聲明這種需求的方法。通過爲所有人提供共享功能

public abstract class A { 
    public final A f(A a) { 
     if (a.getClass() != this.getClass()) { 
      throw new IllegalArgumentException(); 
     } 
     A res = fImpl(a); 
     if (res.getClass() != this.getClass()) { 
      throw new InvalidOperationException(); 
     } 
     return res; 
    } 
    protected abstract A fImpl(A a); // Implementing classes put functionality here 
} 

上面的代碼改變f(A)從抽象方法模板方法:但是,你可以在你的抽象類的水平運行時檢查通過以下的Template Method設計模式A的子類。在這種情況下,共享功能是參數檢查以及返回類型檢查。

這是您的班級的客戶將要使用的方法。另一方面,抽象類的實現者將實現fImpl方法,該方法可以假定其參數A是與其自己的類相匹配的子類。

+1

當然,你可以用泛型做到這一點? ' T f(T a)'? – EJP

+1

@EJP我的理解是,OP希望擴展'A'的類與實現'f'的類相同。換句話說,當你寫'B'時,它的'f'應該看起來如下:'class B {public B f(B a){}}' – dasblinkenlight

+0

@dasblickenlight是的,那就是我想要的!爲什麼EJP的答案不適合這項工作? – bluePhlavio

0
public abstract class A 
{ 
    public A f(A a) throws IllegalArgumentException 
    { 
     if (!this.getClass().equals(a.getClass())) 
     { 
      throw new IllegalArgumentException(); 
     } 
     return a; 
    } 
} 
+0

是的,但是我想保持抽象? – bluePhlavio