2016-01-10 113 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