[英]setting superclass fields in subclass
我有一個抽象 Java class,它有一個哈希碼字段,應該由具體的子類初始化。 我正在考慮將初始化方法抽象化,即
abstract class A {
protected int hashcode;
// hashcode should be initialized in constructor
protected A () { hashcode = setHashcode(); }
abstract int setHashcode() {} // implemented by subclasses
}
但不幸的是,不同的子類需要為 setHashcode 使用不同數量的setHashcode
,例如,class B 可能使用其兩個字段計算哈希碼,而 class C 可能需要三個,但由於對 super 的調用必須是 B 的構造函數中的第一行方案行不通。 所以我想知道是否有不同的方法/設計模式來解決這個問題?
但是由於對 super 的調用必須是 B 的構造函數中的第一行,因此該方案將行不通
為什么行不通? 如果將 hash 代碼的計算放在子類的 static function 中,則可以將預制的 hash 代碼傳遞給超類的構造函數。
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
已經在Object
中定義,並且可以被子類覆蓋。 如果您對 hash 代碼的概念與Object
提供的代碼不同,也許您應該重命名它。
聽起來接口可能適合初始化,因此您創建的任何子類都可以重載接口實現。
改變:
abstract int setHashcode();
到:
abstract int getHashcode(Object...objects);
並且子類需要檢查傳遞的對象的數量和類型。
然后你撥打這樣的電話:
hashcode = getHashcode();
hashcode = getHashcode(o1);
hashcode = getHashcode(o1,o2);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.