我目前正在尝试对 interfaces 和 generics 更熟悉,所以基于我的目标和实现,我写道:
public interface ICipher<T>
{
void EncryptData(T raw);
void DecryptData(T encrypted);
}
然而一位同事说我不应该这样做,他说我应该这样做:
public interface ICipher<TRaw, TEncrypt>
{
TEncrypt EncryptData(TRaw rawData);
TRaw DecryptData(TEncrypt encryptedData);
}
在他提供之后不久,他不得不离开。
但问题是,为什么这是一个更好的解决方案?究竟有什么区别?他们不是都在实现 Generics ,我唯一能想到的就是返回TRaw
和TEncrypt
个对象。
我在这里遗漏了什么吗?这有什么区别,有人可以解释一下吗?
答案 0 :(得分:3)
没有更好或更糟。这取决于用例。
想象一下如何实现这些接口。
class StringCipher : ICipher<string>
{
void EncryptData(string plaintextString);
void DecryptData(string ecnryptedString);
}
和
class StringCipher : ICipher<string, EncryptedContainerObject>
{
EncryptedContainerObject EncryptData(string plaintextString);
string DecryptData(EncryptedContainerObject encryptedObject);
}
第一个版本是接受string
,加密它,结果也应该是string
。
第二个版本更灵活:您放入string
并获得您选择的对象(我编写EncryptedContainerObject
,实际上它通常是{{1}类型})。也许您不希望您的加密数据是byte[]
,但是某些实体可以直接存储在数据库中?
另外:第一个版本缺少加密数据的返回值或访问者。你怎么能再次从实施中得到它?
答案 1 :(得分:2)
这里唯一真正的区别是:
void
)在不知道具体用例的情况下,很难说哪个更好,但似乎Encrypt
和Decrypt
等方法应该返回某些内容 ... < / p>
答案 2 :(得分:0)
如果您尝试实现界面,我认为区别很明显。第一个接口中的方法实际上并没有返回任何数据 - 可能你想从方法中返回数据。
TRaw / TEncrypt的区别在于,通常在加密后您会返回不同的类型 - 例如,加密string
并返回byte[]
。
但是在这种情况下我并不真正看到泛型的需要。特别是输出可能总是具有相同的类型(byte[]
,或者如果你想为了方便而进行base64编码,可能是string
。输入可以从通用中受益,具体取决于您计划如何实现接口。
答案 3 :(得分:0)
它允许您为解密和加密数据使用两种不同的类型。在第一次实现中,加密数据类型将始终与解密数据相同。如果您正在执行生成string
的{{1}}哈希,但是如果您想生成string
,那么只有第二个实现才有效。
使用第二个实现,没有什么会强迫你使用两种不同的类型(即你仍然可以实现integer
):它比第一个更灵活。
在你的第一个实现中,你的方法不会返回任何内容,所以我想你想直接改变参数;在这种情况下,我期望一个引用类型,这是一个澄清这样的东西:
ICipher<string, string>
第二个实现返回一个更好的设计值;如果我要实现接口或使用实现它的类,我希望方法有一个返回值,而不是改变发送的参数。