簡體   English   中英

在子類中設置超類字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM