我有一個抽象類A的java:傳遞一個對象,並返回同一個對象的類型
public astract class A{
public abstract A f(A a) throws IllegalArgumentException;
};
但我想反對一個傳遞給F到具有相同類型的對象本身並返回相同類型的對象,否則拋出IllegalArgumentException。我怎樣才能爲所有的子類實現那一次?在A級課程中有一種方法可以做到這一點?
我有一個抽象類A的java:傳遞一個對象,並返回同一個對象的類型
public astract class A{
public abstract A f(A a) throws IllegalArgumentException;
};
但我想反對一個傳遞給F到具有相同類型的對象本身並返回相同類型的對象,否則拋出IllegalArgumentException。我怎樣才能爲所有的子類實現那一次?在A級課程中有一種方法可以做到這一點?
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
是與其自己的類相匹配的子類。
public abstract class A
{
public A f(A a) throws IllegalArgumentException
{
if (!this.getClass().equals(a.getClass()))
{
throw new IllegalArgumentException();
}
return a;
}
}
是的,但是我想保持抽象? – bluePhlavio
當然,你可以用泛型做到這一點? ' T f(T a)'? –
EJP
@EJP我的理解是,OP希望擴展'A'的類與實現'f'的類相同。換句話說,當你寫'B'時,它的'f'應該看起來如下:'class B {public B f(B a){}}' – dasblinkenlight
@dasblickenlight是的,那就是我想要的!爲什麼EJP的答案不適合這項工作? – bluePhlavio