我发现自己将代码粘贴到子类中。除了继承还有什么我可以做的吗?
I find myself pasting code into subclasses. Is there something else I can do besides inheritance?
我有父类classEncryption.java,主要是一堆加密函数。然后我有 5 个子 classes 扩展 class。它们看起来几乎都一样,除了两点:每个 subclass 需要一个不同的 KEYSET 映射,并且每个 subclass 也有一个独特的功能。我不确定我是否需要继承或其他东西,唯一改变的是 KEYSET 和一个函数
下面是子classes
的例子
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;
}
}
通常根据经验,如果您要复制代码并将其粘贴到子class 中,该代码应该在父class 中。子 class 中唯一应该包含的是它们的独特属性,因此在您的情况下,这只是它们每个中的独特功能。
对于 KEYSET 映射,如果它是硬编码的,您需要使用 protected 关键字。这将允许每个子classes 都有自己的映射,您需要做的就是在实例化期间将实际数据放入映射中。
基本上,如果您在多个子 class 之间复制和粘贴任何内容,在 OOP 中处理此问题的正确方法是在子 [=23] 之间有一个共享的父 class =]具有相同的代码(您正在复制和粘贴的代码)。
此外,如果您最终需要多重继承之类的东西,您可能需要求助于使用 interfaces。
就继承的替代方案而言,您可以使用 delegation,但我相信在您的情况下,简单地使用更多继承可能更容易。
我有父类classEncryption.java,主要是一堆加密函数。然后我有 5 个子 classes 扩展 class。它们看起来几乎都一样,除了两点:每个 subclass 需要一个不同的 KEYSET 映射,并且每个 subclass 也有一个独特的功能。我不确定我是否需要继承或其他东西,唯一改变的是 KEYSET 和一个函数
下面是子classes
的例子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;
}
}
通常根据经验,如果您要复制代码并将其粘贴到子class 中,该代码应该在父class 中。子 class 中唯一应该包含的是它们的独特属性,因此在您的情况下,这只是它们每个中的独特功能。
对于 KEYSET 映射,如果它是硬编码的,您需要使用 protected 关键字。这将允许每个子classes 都有自己的映射,您需要做的就是在实例化期间将实际数据放入映射中。
基本上,如果您在多个子 class 之间复制和粘贴任何内容,在 OOP 中处理此问题的正确方法是在子 [=23] 之间有一个共享的父 class =]具有相同的代码(您正在复制和粘贴的代码)。
此外,如果您最终需要多重继承之类的东西,您可能需要求助于使用 interfaces。
就继承的替代方案而言,您可以使用 delegation,但我相信在您的情况下,简单地使用更多继承可能更容易。