Java 在子类中设置超类字段

Java 在子类中设置超类字段,java,design-patterns,Java,Design Patterns,我有一个抽象Java类,它有一个hashcode字段,应该由具体的子类初始化。我在考虑将初始化方法抽象化,即 abstract class A { protected int hashcode; // hashcode should be initialized in constructor protected A () { hashcode = setHashcode(); } abstract int setHashcode() {} // implemented by su

我有一个抽象Java类,它有一个hashcode字段,应该由具体的子类初始化。我在考虑将初始化方法抽象化,即

abstract class A {
  protected int hashcode;
  // hashcode should be initialized in constructor
  protected A () { hashcode = setHashcode(); }
  abstract int setHashcode() {} // implemented by subclasses
}
但不幸的是,不同的子类需要为
setHashcode
接受不同数量的参数,例如,类B可能使用它的两个字段来计算hashcode,类C可能需要三个字段,但由于对super的调用必须是B的构造函数中的第一行,因此该方案不起作用。所以我想知道是否有不同的方法/设计模式来解决这个问题

但是,由于对super的调用必须是B的构造函数中的第一行,因此该方案将不起作用

为什么它不起作用?如果将哈希代码的计算放在子类的静态函数中,则可以将预先生成的哈希代码传递给超类的构造函数

class BaseClass {
    private int hashCode;
    protected BaseClass(int hashCode) {this.hashCode = hashCode;}
}
class DerivedClass : BaseClass {
    private static int calcHash(String str) {
        return str.hashCode();
    }
    public DerivedClass(String s) {
        super(calcHash(str));
    }
}

您实际上不需要将值存储在超类中,只需声明子类将覆盖的抽象
getHashCode

public abstract class Base {
  protected abstract int getHashCode();
}
这会更好,因为不管存储需求如何,方法的“意图”都会得到保留


顺便提一下,
hashCode
已经在
对象中定义,并且可以被子类覆盖。如果您对哈希代码的概念与
对象提供的不同,也许您应该对其进行重命名。

听起来接口可能适合初始化,因此您创建的任何子类都可以重载接口实现。

更改:

abstract int setHashcode(); 
致:

子类需要检查传递的对象的数量和类型

然后你会打这样的电话:

  hashcode = getHashcode(); 
  hashcode = getHashcode(o1); 
  hashcode = getHashcode(o1,o2); 

作为对style的一个说明:使用名为
setSomething()
的方法是很尴尬的,它不设置任何值,而是返回计算值
calculateHashcode
determinatehashcode
可以更好地表达方法的意图。您可能会在中找到有用的信息。
  hashcode = getHashcode(); 
  hashcode = getHashcode(o1); 
  hashcode = getHashcode(o1,o2);