例如,如果我有这样的类:
public class TestClass {
public IDictionary<string, IList<IList<object>>> Variable {get; set;}
}
我觉得我需要在其他地方使用这种类型,但是不想在任何地方继续使用IDictionary<string, IList<IList<object>>>
,因为它看起来有点臭......对我来说,通过添加来重构代码是多么“安全”另外2个类看起来像这样:
public class SubClass1 : Dictionary<string, SubClass2> {
}
public class SubClass2 : List<IList<object>>{
}
并将原始类更改为:
public class TestClass {
public SubClass1 Variable {get; set;}
}
当我的控件之外可能有一些代码(这个DLL被其他项目引用)时可能正在尝试使用原始类型?我的假设是它能够自然地投射它,因为它基本上只是以稍微不同的方式编写的相同代码..但是我有什么需要注意的事情,或者我认为这是安全的简直错了?
答案 0 :(得分:0)
这无论如何都不安全,因为在你改变之后:
// does not compile
IDictionary<string, IList<IList<object>>> x = new TestClass().Variable;
因此,执行此操作的任何当前代码都将在运行时(无需重新编译)和编译时失败。可能有其他方法可能会失败,但有一种方法足以表明它不安全。
请注意,您的问题中的类不会继承旧的(旧的是接口),也不会实现旧的接口。如果确实如此 - 它应该或多或少安全。
答案 1 :(得分:0)
这可能是基于意见的但是......
让我们描述一些陈述:
将来可以简化更严格的合同
课程应该开放以进行扩展
儿童班不得改变父母的行为
让我们看看第一种情况:
public class TestClass {
public IDictionary<string, IList<IList<object>>> Variable {get; set;}
}
我有疑问:
您使用所有相关方法(添加,删除等)公开IDictionary
接口,与IList
相同。如果有一天你想禁止修改它,你就会遇到问题。
此:
public class SubClass1 : Dictionary<string, SubClass2> {
}
由于继承,你会看到同样的问题。
使用预定义方法的合成可能会更好:
public class SubClass1 {
private IDictionary<string, IList<IList<object>>> _variable;
public IList<IList<object>> GetData(string key) {
return _variable[key];
}
}
将来,您可以根据需要更改GetData
内幕,将IDictionary替换为其他内容。
另外,我建议使用IReadOnlyList
界面来防止破坏数据。