我发现自己把代码粘贴到子类中.除了继承,我还能做什么吗



我有一个父类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;
}
}

一般来说,如果要复制代码并将其粘贴到子类中,则该代码应该在父类中。子类中唯一应该包含的是它们的唯一属性,所以在您的情况下,这只是每个子类中的唯一函数。

对于KEYSET映射,如果它是硬编码的,您将希望使用受保护的关键字。这将允许每个子类都有自己的映射,您所需要做的就是在它们的实例化过程中将实际数据放入映射中。

基本上,如果你在多个子类之间复制和粘贴任何东西,在OOP中处理这一问题的正确方法是在具有相同代码(你正在复制和粘贴的代码(的子类之间有一个共享的父类。

此外,如果您最终需要像多重继承这样的东西,您可能需要使用接口。

就继承的替代方案而言,您可以使用委派,但我相信在您的情况下,简单地使用更多的继承可能会更容易。

相关内容

最新更新