我有一个抽象类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