我有父類Encryption.java,主要是一堆加密函式。然后我有 5 個擴展該類的子類。它們看起來幾乎都一??樣,除了兩件事:每個子類需要不同的 KEYSET 映射,并且每個子類也有一個獨特的功能。我不確定我是否需要繼承或其他東西,唯一改變的是 KEYSET 和一個函式
這是子類的示例
public class Keyset_1 extends Encryption{
private byte variant;
private String side;
private final Map<String,String> KEYSET = new HashMap<String,String>(){
{
put("awk_1_acq", "0123456789ABCDEF0123456789ABCDEF");
put("awk_2_acq", "0123456789ABCDEF0123456789ABCDEF");
...
}
};
//constructor is same in each subclass
public Keyset_1(byte b, String side) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, NoSuchProviderException {
super();
this.variant = b;
this.side = side;
}
//Empty method in parent class, overridden here
@Override
public byte[] getZCMKVariant(){
byte[] key;
if (side.equalsIgnoreCase("acq"))
key = ISOUtil.hex2byte(KEYSET.get("zcmk_acq"));
else
key = ISOUtil.hex2byte(KEYSET.get("zcmk_iss"));
applyVariant(key, variant);
return key;
}
}
uj5u.com熱心網友回復:
一般來說,如果您要復制代碼并將其粘貼到子類中,則該代碼應位于父類中。子類中唯一應該是它們的唯一屬性,因此在您的情況下,這只是每個子類中的唯一功能。
對于 KEYSET 映射,如果它是硬編碼的,您將需要使用protected關鍵字。這將允許每個子類擁有自己的地圖,您需要做的就是在實體化期間將實際資料放入地圖中。
基本上,如果您在多個子類之間復制和粘貼任何內容,那么在 OOP 中處理此問題的正確方法是在具有相同代碼(您正在復制和粘貼的代碼)的子類之間擁有一個共享的父類。
此外,如果您最終需要多重繼承之類的東西,您可能需要求助于使用介面。
在繼承的替代方案方面,您可以使用委托,但我相信在您的情況下,簡單地使用更多繼承可能更容易。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/428621.html
下一篇:LNK2019:未決議的外部符號-在VisualStudio2022中將.h檔案與.cpp(定義)檔案鏈接不起作用
