我有工厂的界面。假设存在public interface ModuleFactory<T extends Module> {
T createModule(long seed);
}
的接口(我需要区分模块子类型)。由继承树的相同叶类定义的任何两个工厂总是相同的。
Set
这些工厂进入.equals()
,因此它们的相同性由Object
确定。因此,我需要一种方法来强制实现类重写此方法。否则,该集将填写重复项。
问题是boolean equals(Object obj);
已经实现了这个方法,所以任何具体的类都已经有了该方法的实现。我不能简单地将program main
use, intrinsic :: ISO_FORTRAN_ENV, only : dp=>REAL64, stdout=>OUTPUT_UNIT
implicit none
real(kind=dp), parameter :: pi = 3.141592653589793238462643383279502884197_dp
write(stdout,*) pi ! Test the default format
write(stdout,'(f)') pi ! Test the specific decimal default format
write(stdout,'(f20.15)') pi ! Probably sufficient precision...
write(stdout,'(f30.20)') pi ! EXCESSIVE PRECISION!
end program main
放在我的界面中,因为任何具体的类都已经满足了默认实现的接口。如何强制覆盖?
答案 0 :(得分:0)
您无法强制等于覆盖。但是你可以创建一个抽象类,为equals()
提供一个实现,它实际上会调用一个抽象的customEquals()方法。所以,你的所有课程都被迫实施customEquals()
;您可以在其中为equals
提供自定义实现。
答案 1 :(得分:0)
尝试使用下面的代码:
public abstract class ModuleFactory<T extends Module> {
public abstract T createModule(long seed);
private int _hash = -1;
// You yourself generate the HashCode on create instance class
public OnChangeStatusListener(int _hash) {
this._hash = _hash;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ModuleFactory that = (ModuleFactory) o;
return _hash == that._hash;
}
@Override
public int hashCode() {
return _hash;
}
}