使用刚刚从先前定义的类型继承的新类替换不太具体的变量类型是否安全?

时间:2018-03-22 09:12:50

标签: c# refactoring

例如,如果我有这样的类:

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被其他项目引用)时可能正在尝试使用原始类型?我的假设是它能够自然地投射它,因为它基本上只是以稍微不同的方式编写的相同代码..但是我有什么需要注意的事情,或者我认为这是安全的简直错了?

2 个答案:

答案 0 :(得分:0)

这无论如何都不安全,因为在你改变之后:

// does not compile
IDictionary<string, IList<IList<object>>> x = new TestClass().Variable;

因此,执行此操作的任何当前代码都将在运行时(无需重新编译)和编译时失败。可能有其他方法可能会失败,但有一种方法足以表明它不安全。

请注意,您的问题中的类不会继承旧的(旧的是接口),也不会实现旧的接口。如果确实如此 - 它应该或多或少安全。

答案 1 :(得分:0)

这可能是基于意见的但是......

让我们描述一些陈述:

  1. 将来可以简化更严格的合同

  2. 课程应该开放以进行扩展

  3. 儿童班不得改变父母的行为

  4. 让我们看看第一种情况:

    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界面来防止破坏数据。